Skip to content

feat(macos): la CA local se instala en la confianza de la persona usuaria de macOS - #2030

Merged
sgomez merged 2 commits into
agent/developer/spec-2000from
agent/developer/issue-2014
Oct 19, 2026
Merged

sgomez merged 2 commits into
agent/developer/spec-2000from
agent/developer/issue-2014

Conversation

@sgomez

@sgomez sgomez commented Oct 19, 2026

Copy link
Copy Markdown
Owner

Closes #2014

What changed

  • site/adapters/macos_trust.rs: MacosUserTrust sustituye a PendingMacosKeychainTrust detrás de TrustStores. Instala la CA local en el llavero de inicio de sesión y la marca de confianza en el dominio de la persona usuaria (SecTrustSettingsSetTrustSettings), así que macOS pide la contraseña con su diálogo. Mide la confianza sin escribir y la retira (SecTrustSettingsRemoveTrustSettings y la copia del llavero). local_cas lista las CA de rFirma del llavero, de modo que el barrido de huérfanas también funciona en macOS.
  • La confianza de macOS es un único perfil, MACOS_USER_TRUST, como SYSTEM_ROOT_STORE en Windows. brand_of lo rotula StoreBrand::Macos, la misma marca que El Almacén de macOS lista los certificados del llavero #2004 da a los certificados del llavero (el contrato y la guarda de cruce ya la llevan).
  • Si se cancela el diálogo (errAuthorizationCanceled, errSecUserCanceled), el error dice «se ha cancelado el diálogo de contraseña de macOS», no un fallo genérico. La señal vuelve a medir y deja la CA como no instalada, con su acción de instalar.
  • ADR-0040: sale la fila del adaptador pendiente y cambia la consecuencia que decía que el navegador no confiaba.
  • security-framework, security-framework-sys y core-foundation para macOS. Ya estaban en Cargo.lock, y al fusionar quedó la declaración de El Almacén de macOS lista los certificados del llavero #2004.

Decisiones sobre puntos ambiguos:

  • «Caducidad»: hoy la señal del panel de estado no muestra fechas, tampoco en Windows. En macOS, la caducidad la gestiona el ciclo de vida de siempre: una CA caducada se sustituye y la nueva queda de confianza en el Almacén de macOS (probado). La fecha visible le corresponde a --debug-info (--debug-info en macOS #2020), que depende de esta PR.
  • Confianza «siempre» (configuración vacía), como la raíz del usuario en Windows: la CA ya lleva sus restricciones de nombre. tls_trust_settings_for_certificate del crate no cuenta una configuración vacía, así que trust_of la reconoce aparte (always_trusted).
  • Interfaz: el rótulo «Almacén de macOS» en TypeScript y en i18n es de La interfaz rotula el Almacén de macOS en la lista, el asistente y el estado #2015, que depende de esta PR. Hasta entonces, storeBrandLabel no tiene caso para "macos".
  • Igual que en Windows, el primer arranque del escritorio instala la CA y, en macOS, pedirá la contraseña.

Test plan

  • Sustituye al adaptador pendiente y lo retira de la tabla del ADR-0040: desktop_trust_stores y trust_profiles de macOS. the_trust_profile_is_the_user_trust, en rojo antes de la marca; las guardas single_cfg_os_site siguen en verde, porque el único cfg está en site/adapters/mod.rs, ya autorizado.
  • El caso de uso de confianza muestra el Almacén de macOS con su estado y su caducidad, con dobles (TD-135): installing_with_the_password_given_shows_the_macos_store_trusting_the_local_ca y an_expired_local_ca_is_replaced_and_the_macos_store_trusts_the_new_one; también the_macos_user_trust_is_the_macos_brand, que vi en rojo (Nssdb). Las pruebas de la señal salieron en verde a la primera porque la marca ya estaba; se pusieron en rojo con brand_of roto a propósito y después lo restauré.
  • Cancelar el diálogo deja la CA como no instalada, sin error genérico: cancelling_the_password_dialog_leaves_the_local_ca_not_installed_and_offers_to_install_it y a_cancelled_password_dialog_is_told_apart_from_a_failure, esta última vista en rojo con la rama de cancelación quitada.
  • El adaptador real, en macOS y sin pedir contraseña: a_local_ca_never_installed_is_not_trusted, vista en rojo con la mutación, y a_path_that_is_not_the_user_trust_is_unreachable_without_asking_for_the_password. Pasan en local en un Mac.
  • Prueba manual: instalar la CA desde el estado, ver la marca, hacer un trámite en Safari y retirar. Pide contraseña, así que no hay prueba automática (TD-135).
  • Checks en local, macOS: just lint-rust (clippy) en verde; las pruebas de desktop::, identity::, site::adapters, site::application::trust y crossing::, y las guardas single_cfg_os_site, contract_discovers_adapters, modules_open_with_a_header, comments_cite_nothing_that_rots, adr_citations_resolve y module_directions, en verde después de fusionar spec-2000.

Sergio Gómez Bachiller added 2 commits October 19, 2026 16:05
…aria de macOS

Implements #2014: La CA local se instala en la confianza de la persona usuaria de macOS
- MacosUserTrust sustituye a PendingMacosKeychainTrust: Security.framework en el dominio
  de la persona usuaria, con el diálogo de contraseña del sistema.
- La confianza de macOS es un perfil más (MACOS_USER_TRUST) con la marca StoreBrand::Macos.
- Cancelar el diálogo se distingue de un fallo y deja la CA como no instalada.
…agent/developer/issue-2014

# Conflicts:
#	rfirma-app/src-tauri/Cargo.toml
#	rfirma-app/src-tauri/src/desktop/domain/status.rs
@sgomez
sgomez marked this pull request as ready for review October 19, 2026 14:08
@sgomez
sgomez merged commit 0458fa8 into agent/developer/spec-2000 Oct 19, 2026
@sgomez
sgomez deleted the agent/developer/issue-2014 branch October 19, 2026 14:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant