Repository navigation
rFirma en macOS: firmar con los certificados del llavero y la integración con el sistema #2000
Copy link
Copy link
Closed
20 / 2020 of 20 issues completed
Copy link
Labels
ready-for-agentFully specified, an agent can pick it upFully specified, an agent can pick it up
Description
Alcance: firmar con los certificados del llavero de macOS y la integración con el sistema. Las tarjetas y el DNIe están en #2043 (
needs-triage); la distribución por el tap de Homebrew, en #2045.
Problem Statement
En macOS, rFirma compila, se empaqueta y firma con una clave en memoria (ADR-0040), pero quien lo abre en su Mac no puede firmar nada:
- no ve ningún certificado: ni los de su llavero. La búsqueda de almacenes es la de Linux (módulos PKCS#11 y bases NSS de
/usr/lib), que en un Mac no encuentra nada; - no puede instalar un
.p12: el Almacén de rFirma es una base NSS y macOS no trae NSS; - no puede hacer un trámite de sede: la CA local consta siempre como no instalada y no hay forma de instalarla, así que el navegador no confía en el servidor local;
- no sabe quién abre
afirma://ni puede elegir rFirma si AutoFirma está instalada; - una sede que pide el almacén
APPLErecibe un error; - si rFirma no arranca, el aviso sale por la salida de error, que en un
.appnadie ve, y--debug-infohabla de NSS; - la entrega no publica el paquete de macOS y rFirma no se actualiza en macOS.
Solution
En macOS, rFirma usa la API de macOS siempre que puede, igual que en Windows (ID-475):
- Los certificados con clave de software del llavero aparecen como Almacén de macOS, y se firma con ellos por la API del sistema: Rust calcula el resumen y macOS lo firma (ADR-0001). La contraseña o el permiso los pide macOS con su diálogo.
- «Instalar certificado» lleva el
.p12al llavero de inicio de sesión (ADR-0034); en macOS no hay Almacén de rFirma. - La CA local se instala en la confianza de la persona usuaria de macOS, con el diálogo de contraseña del sistema; Safari, Chrome y Firefox (120 o posterior) confían en ella sin tocar perfiles.
- rFirma sabe quién abre
afirma://y deja elegirse, respetando a AutoFirma. APPLEy-store appleacotan al Almacén de macOS.- El aviso de arranque es una alerta nativa y
--debug-infohabla de macOS. - La entrega publica el paquete de macOS con firma ad hoc y rFirma se actualiza sola, por el canal de Windows.
- Mientras El DNIe y las tarjetas en macOS #2043 no decida, macOS no lee tarjetas: el Almacén de macOS no lista identidades con clave en un token y la línea del lector no aparece.
User Stories
Certificados del llavero
- Como persona con un certificado en el llavero de mi Mac, quiero verlo en la lista de rFirma, para firmar sin exportarlo.
- Como persona con un certificado en el llavero, quiero firmar un PDF con él desde la ventana de rFirma, para no depender de AutoFirma.
- Como persona con un certificado en el llavero, quiero firmar con él en un trámite de sede, para terminar el trámite.
- Como persona que firma con un certificado del llavero, quiero que me pida permiso el diálogo de macOS, el que ya conozco, para confiar en quién usa mi clave.
- Como persona que pulsa «Denegar» en el diálogo de macOS, quiero que rFirma lo trate como una cancelación mía y no como un fallo.
- Como persona que escribe mal la contraseña en el diálogo de macOS, quiero que rFirma me diga que era incorrecta.
- Como persona con certificados en el llavero, quiero ver su fila rotulada «Almacén de macOS», para saber de dónde sale.
- Como persona con el mismo certificado en el llavero y en el perfil de Firefox, quiero verlo una sola vez.
- Como persona con certificados sin clave privada en el llavero, quiero que solo salgan los que tienen clave, para no elegir uno con el que no se puede firmar.
- Como persona que firma con SHA-1 porque lo permití en Preferencias, quiero que también funcione con el llavero, como en Windows.
- Como persona con un certificado de curva elíptica en el llavero, quiero firmar con él igual que con uno RSA.
- Como persona que lista certificados, quiero que rFirma no abra la clave ni me pida nada solo por listar.
- Como persona con una tarjeta cuyo controlador mete sus certificados en el llavero, quiero no verlos en el Almacén de macOS mientras rFirma no sepa firmar con tarjetas en macOS, para no elegir uno que va a fallar.
- Como persona que mete una tarjeta en su Mac, quiero que rFirma no me muestre una línea del lector que prometa algo que no hace.
Sedes y línea de órdenes
- Como sede que pide el almacén
APPLE, quiero que rFirma en macOS ofrezca los certificados del Almacén de macOS, como AutoFirma. - Como persona que usa la línea de órdenes de AutoFirma, quiero que
-store applefuncione con rFirma en macOS.
Instalar un certificado
- Como persona con un
.p12, quiero instalarlo desde rFirma en mi Mac, para firmar con él después. - Como persona que instala un
.p12, quiero que acabe en mi llavero de inicio de sesión, para que lo vean también otras aplicaciones del Mac. - Como persona que escribe mal la contraseña del
.p12, quiero que rFirma me lo diga sin instalar nada. - Como persona que quita un certificado instalado desde rFirma, quiero que desaparezca del llavero.
Trámites de sede
- Como persona que hace su primer trámite en macOS, quiero instalar la CA local desde rFirma, para que el navegador confíe en el servidor local.
- Como persona que instala la CA, quiero que macOS me pida mi contraseña con su diálogo, para saber que el cambio lo autorizo yo.
- Como persona que cancela ese diálogo, quiero que rFirma diga que la CA no se instaló, sin error genérico.
- Como persona que usa Safari, Chrome o Firefox, quiero que todos confíen en la CA sin configurar nada en cada uno.
- Como persona, quiero ver en el estado de rFirma si la CA está instalada en «Almacén de macOS» y cuándo caduca.
- Como persona que quiere retirar la CA, quiero hacerlo desde rFirma.
- Como persona con AutoFirma instalada, quiero ver quién abre hoy
afirma://y poder elegir rFirma, sin que rFirma se lo quede sin preguntar. - Como persona que vuelve a AutoFirma, quiero poder elegirla otra vez.
- Como persona que pulsa «Firmar» en una sede con rFirma cerrada, quiero que rFirma se abra y atienda el trámite.
Arranque, diagnóstico y actualización
- Como persona a la que rFirma no le arranca, quiero ver el motivo en una ventana de macOS, no en una terminal que no tengo abierta.
- Como persona que pide ayuda, quiero que
--debug-infomuestre en macOS la confianza de la CA y los controladores de tarjeta del sistema, para adjuntarlo a mi consulta. - Como persona con rFirma en mi Mac, quiero que se actualice sola, como en Windows.
- Como responsable del proyecto, quiero que cada versión publique el paquete de macOS en la Release, para que haya algo que instalar.
Proyecto
- Como desarrollador en un Mac, quiero registrar el ejecutable de desarrollo como manejador de
afirma://conjust dev-handler, como en Linux. - Como desarrollador, quiero probar el listado y la firma del Almacén de macOS en el CI sin tocar el llavero de nadie, con un llavero temporal.
- Como responsable del proyecto, quiero que la regla «en macOS, la API de macOS» quede en el ADR-0040, para que nadie la rompa sin conocerla.
- Como persona con Linux o Windows, quiero que nada de esto cambie lo que veo.
Implementation Decisions
La regla
- ID-527: En macOS se usa la API de macOS siempre que se pueda (Security.framework y LaunchServices), como ID-475 en Windows. Las tarjetas y el DNIe quedan fuera hasta que El DNIe y las tarjetas en macOS #2043 decida. El ADR-0040 se reescribe en su sitio con la regla, como se hizo con el ADR-0035; los adaptadores pendientes que esta spec sustituye salen de su tabla.
El Almacén de macOS
- ID-528: Término nuevo «Almacén de macOS» (clase de almacén propia, como
StoreClass::Windows): los certificados con clave privada del llavero de la persona usuaria. Se rotula «Almacén de macOS» en la lista, el asistente y el estado. El glosario lo define junto a «Almacén de Windows»; «llavero» sigue reservado para lo que guarda secretos. - ID-529: Un adaptador del puerto
Tokenpara el Almacén de macOS, análogo al del Almacén de Windows. Lista identidades del llavero sin abrir la clave, completa la cadena con los certificados del llavero y del sistema, y entrega con cada certificado si su clave vive en un token del sistema (tarjeta) o en software. - ID-530: La firma sigue el ADR-0001: Rust calcula el resumen y el sistema firma el resumen ya calculado con RSA PKCS#1 v1.5, RSA PSS y ECDSA (que macOS ya devuelve en DER), SHA-1 incluido con su rama explícita (Windows: CNG firma con SHA-1 cuando la preferencia lo permite #1625). Los errores del sistema se traducen a las situaciones de siempre: cancelación, contraseña o PIN incorrecto, PIN bloqueado, tarjeta retirada.
- ID-531: El orden de almacenes pasa a ser: tarjeta, Almacén de Windows o Almacén de macOS, Almacén de rFirma, NSS del sistema, familia Firefox, familia Chromium. El glosario se actualiza.
- ID-554: El Almacén de macOS solo lista certificados con clave de software. Una identidad con la clave en un token del sistema no sale, sea el DNIe, una PIV o cualquier otra tarjeta: ID-532 cae (Sonda: una app con firma ad hoc y las identidades de un token del sistema en macOS #2002) y las tarjetas son de El DNIe y las tarjetas en macOS #2043.
- ID-533:
APPLEy-store appleacotan al Almacén de macOS en macOS (paridad con AutoFirma, ADR-0041). Fuera de macOS siguen como hoy. - ID-537: Para el Almacén de macOS no hay diálogo propio: la contraseña o el PIN los pide macOS, como en Windows (ID-477).
Instalar certificados
- ID-534: En macOS, «Instalar certificado» importa el
.p12al llavero de inicio de sesión (ADR-0034) y el certificado aparece en el Almacén de macOS. Quitar un certificado instalado lo borra del llavero. En macOS no existe el Almacén de rFirma ni el llavero de su PIN; el adaptador pendiente del llavero se queda respondiendo que no hay, sin uso.
Lectores
- ID-555: En macOS no se vigilan los lectores ni aparece la línea del lector mientras rFirma no lea tarjetas en macOS. El vigilante, el diálogo nativo del PIN de PKCS#11 y la ayuda de la línea «ilegible» de macOS se quedan en el código para El DNIe y las tarjetas en macOS #2043.
Integración con el sistema
- ID-542: La CA local se instala en la confianza del dominio de la persona usuaria de macOS (ADR-0005), con el diálogo de contraseña que pide el sistema; rFirma no lo sustituye ni lo esquiva. Se mide si está instalada y su caducidad, y se retira desde rFirma. Marca nueva «Almacén de macOS» en el asistente y el estado, junto a «Almacén de Windows». No hay perfiles de Firefox que gestionar en macOS: Firefox 120 o posterior importa la confianza del usuario. Sustituye al adaptador pendiente de la CA en macOS.
- ID-543:
afirma://por LaunchServices: rFirma lee qué aplicaciones declaran el esquema y cuál lo abre, y la persona elige con la API actual del sistema. Igual que en Linux y Windows, rFirma nunca se queda con el esquema sin que la persona lo pida. Sustituye al adaptador pendiente de los manejadores en macOS. El arranque en frío desdeafirma://con el.appreal se prueba a mano. - ID-544:
just dev-handlerfunciona en macOS: registra el ejecutable de desarrollo como manejador deafirma://por LaunchServices, como hoy hace conxdg-mimeen Linux. - ID-545: El aviso de arranque en macOS es una alerta nativa del sistema, que no necesita la ventana de Tauri.
- ID-546:
--debug-infoen macOS sustituye las secciones de NSS por la confianza de la CA local en el Almacén de macOS (instalada, caducidad) y los controladores de tarjeta del sistema (como --debug-info: almacén de Windows y minidrivers #1864 en Windows). Los módulos PKCS#11 son de El DNIe y las tarjetas en macOS #2043.
Entrega y actualización
- ID-548: No hay cuenta de Apple Developer. rFirma para Mac no se firma con Developer ID ni se notariza; mantiene la firma ad hoc y el hardened runtime desactivado del ADR-0040, que además deja cargar módulos PKCS#11 de terceros.
- ID-550: En macOS, rFirma se actualiza sola con el canal de Windows (Actualización de rFirma en Windows desde la propia aplicación #1230): la entrega publica el paquete de actualización de macOS firmado con minisign y su entrada en
latest.json, y rFirma lo comprueba e instala igual que en Windows. Una instalación por Homebrew no se trata como gestionada por paquete; el cask y suauto_updates: trueson de Distribución de rFirma para Mac por un tap de Homebrew #2045.
Testing Decisions
- TD-131: Una buena prueba mira el comportamiento visible desde fuera: la lista que recibe la ventana con sus chips y su orden, el estado del lector, lo que se firma y si verifica, el estado de la CA y del manejador. No mira llamadas a Security.framework ni a LaunchServices.
- TD-132: El Almacén de macOS en el caso de uso de listado de
identity, con un doble del adaptador en el puertoTokenque entrega certificados con clave de software y con clave en un token: los primeros salen como «Almacén de macOS» y los segundos no salen. Precedente: TD-126 y TD-117/118. - TD-134: El adaptador del Almacén de macOS con pruebas
cfg(macos)contra un llavero temporal que cada prueba crea, desbloquea y borra, con un certificado de pruebas propio (RSA y curva elíptica): listar, firmar con PKCS#1, PSS y ECDSA y verificar la firma; importar un.p12y quitarlo. Nunca tocan el llavero de inicio de sesión de quien las corre. Precedente: las pruebas CNG de TD-128, que crean y borran su certificado. - TD-135: La CA local y
afirma://por sus puertos actuales con dobles: el caso de uso de confianza muestra «Almacén de macOS» con su estado y caducidad, y el de manejadores respeta a AutoFirma. Los adaptadores reales, que piden contraseña o tocan LaunchServices, se prueban a mano. - TD-140: El canal de actualización de macOS se prueba como el de Windows (Canal windows que comprueba la versión contra latest.json #1233): la comprobación de versión contra
latest.jsonelige la entradadarwin-aarch64, y una instalación por Homebrew no desactiva el actualizador. - TD-141: Las guardas de plataforma (
AUTHORISED_SITES, ADR-0035) incluyen cada adaptador nuevo de macOS y siguen en verde en Linux y Windows. - TD-144: Los lectores en macOS se prueban en el caso de uso de lectores: en macOS no se vigilan y no hay línea del lector; Linux y Windows no cambian.
Out of Scope
- Las tarjetas y el DNIe en macOS, el diálogo propio del PIN de PKCS#11 en uso y la búsqueda de módulos PKCS#11: El DNIe y las tarjetas en macOS #2043.
- La distribución por el tap de Homebrew y sus instrucciones: Distribución de rFirma para Mac por un tap de Homebrew #2045.
- Firma con Developer ID, notarización y cualquier otra vía que necesite cuenta de Apple Developer (ID-548).
- macOS en Intel.
- Leer certificados del almacén propio de Firefox en macOS.
Further Notes
- Ya integrado en la rama de la spec y que sirve a El DNIe y las tarjetas en macOS #2043: el vigilante PC/SC en macOS (El vigilante de lectores corre en macOS #2009), el diálogo nativo del PIN de PKCS#11 (El PIN de una tarjeta por PKCS#11 se pide con un diálogo nativo de macOS #2011) y la ayuda de la línea «ilegible» de macOS (La línea del lector «ilegible» en macOS ofrece OpenSC y la DGP #2016).
- Las decisiones ID-532, ID-535, ID-536, ID-538, ID-539, ID-541 e ID-547 pasaron a El DNIe y las tarjetas en macOS #2043; ID-549, a Distribución de rFirma para Mac por un tap de Homebrew #2045. Sus números no se reutilizan.
- Instalar confianza en el dominio de usuario pide contraseña (Apple); Firefox 120 importa en macOS las raíces del usuario (notas).
- Con firma ad hoc (ID-548), cada versión es otra identidad de código para macOS, y el «Permitir siempre» del llavero puede volver a pedirse tras cada actualización.
- El carril de macOS del CI corre en
macos-14y el mínimo de la aplicación es 15.4; las pruebas de esta spec no arrancan la aplicación.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
ready-for-agentFully specified, an agent can pick it upFully specified, an agent can pick it up
Activity
APPLEy-store appleacotan al Almacén de macOS #2006.p12al llavero de inicio de sesión en macOS #2007dnieen macOS #201315 remaining items
dnieen macOS #2013[-]rFirma en macOS: el Almacén de macOS, la integración con el sistema, el DNIe por PKCS#11 y el tap de Homebrew[/-][+]rFirma en macOS: firmar con los certificados del llavero, la integración con el sistema y el tap de Homebrew[/+][-]rFirma en macOS: firmar con los certificados del llavero, la integración con el sistema y el tap de Homebrew[/-][+]rFirma en macOS: firmar con los certificados del llavero y la integración con el sistema[/+]sgomez commentedon Oct 19, 2026
Escalated by /developer: fix cycle 1 blocked: No review-pr findings exist on PR #2042. The only open thread is CodeQL alert #200 (actions/cache-poisoning in the build.yml macos job, which turns the CodeQL check red). It is the same false positive the owner already dismissed as #11-13, so there is nothing to fix in code. The. PR: #2042.
docs(agents): record spec #2000 run
docs(agents): record spec #2000 run