Repository navigation
feat(identity): el Almacén de macOS lista los certificados del llavero - #2028
Merged
Merged
Conversation
added 2 commits
October 19, 2026 15:59
Implements #2004: El Almacén de macOS lista los certificados del llavero - `MacosToken` lista las identidades del llavero por Security.framework sin pedir nada y apunta en `key_provider` el token del sistema de la clave, si lo hay. - `StoreClass::Macos` comparte el puesto del Almacén de Windows en el orden de copias. - Firmar con el llavero queda para #2005: por ahora el adaptador lo rechaza.
…agent/developer/issue-2004 # Conflicts: # packaging/flatpak/sources.lock # rfirma-app/src-tauri/Cargo.toml
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #2004
What changed
identity/adapters/macos_store.rs:MacosToken, el adaptador del puertoTokenen macOS. Los almaceneskeychain:van al llavero; el resto, aRealToken.desktop_storesen macOS añade el llavero de la persona usuaria (keychain:search-list) delante de los PKCS#11 descubiertos, salvo siRFIRMA_PKCS11_MODULEnombra un módulo, que sigue mandando.macos_store/keychain.rs: lista las identidades conSecItemCopyMatchingcon la interacción desactivada (SecKeychain::disable_user_interaction): listar nunca pide contraseña. El token del sistema de la clave (kSecAttrTokenID, leído de los atributos de la clave sin usarla) va enCertificateRef::key_provider; una clave de software no tiene.every_certificatedevuelve todos los certificados del llavero y, para la lista de búsqueda, también los deSystemRootCertificates.keychain, para completar la cadena.StoreClass::MacosconMACOS_STORE_PREFIX = "keychain:"; en el orden de copias ocupa el mismo puesto que Windows (ID-531).matchexhaustivos sobreStoreClasscruzanStoreMarkView::MacosyStoreBrand::Macos("macos"), y el contrato se ha regenerado.-certtuilo rotula «Almacén de macOS» y--jsonlo nombraapple; el esquema delistaliasesadmite ese nombre.pkcs11/mod.rsy el mapa deidentity.Decisiones en los puntos ambiguos:
offersysign_with_secretcontestanMechanismNotOffered(«el Almacén de macOS todavía no firma»).import_pkcs12yremove_certificatesiguen enRealTokenhasta «Instalar certificado» lleva el.p12al llavero de inicio de sesión en macOS #2007.key_provider, peroCertificateRef::class_underaún no lo mira.shows_cardsno incluyeMacos."macos"cruza la frontera, pero el frontend aún no tiene rótulo para él.SecretName::of(Macos)esPassword: lo que pide macOS para una clave de software es la contraseña del llavero.cfgde sistema. Los compila solo macOS por el#[cfg(target_os = "macos")] pub mod macos_store;deidentity/adapters/mod.rs, que ya figuraba enAUTHORISED_SITES. Por eso la lista no cambia; si les añadiera uncfgpropio, la guarda se pondría en rojo.listaliases.schema.jsonla descripción ya nombraapplecomo valor de--store, aunque lo aceptaAPPLEy-store appleacotan al Almacén de macOS #2006.Test plan
identity/application/certificates/tests/macos_store.rs:a_keychain_certificate_with_its_key_in_software_is_in_the_macos_store,the_macos_store_comes_after_the_card_and_before_the_rfirma_store_and_the_nss_onesywithout_a_card_the_macos_copy_is_the_one_behind_the_row. Las vi en rojo antes de implementar. Después las comprobé con una mutación (preferencia 6): rojo.SecKeychainCreateun llavero fuera de la lista de búsqueda y lo borra conSecKeychainDelete. Enidentity/adapters/macos_store/tests.rs:lists_an_rsa_and_an_elliptic_curve_certificate_and_leaves_out_one_without_its_key,a_certificate_with_its_key_in_software_stays_in_the_macos_store,the_chain_of_a_keychain_certificate_is_completed_with_its_issuer_from_the_keychainymacos_asks_for_the_secret_and_never_warns_about_the_pin. Las vi en rojo con el adaptador vacío. La de la cadena la comprobé además con una mutación (every_certificatevacío): rojo.the_macos_store_comes_before_the_pkcs11_stores_unless_a_module_is_named: comprobada con una mutación, rojo.AUTHORISED_SITESy las guardas estructurales (single_cfg_os_site, cabeceras, comentarios, direcciones, contrato, ADR) pasan en verde en local. El veredicto de Linux y Windows es del CI.just test-one-rust --libentero (2806) yjust check-rusten verde en macOS.packaging/flatpak/sources.lockcalculado conshasum -a 256:just flatpak-sourcesno corre sinuv.Cargo.lockno trae paquetes nuevos (security-frameworkya estaba en el árbol).Discoveries
just test-one-rust <filtro>sin--libtambién lanza los binarios detests/, ynative_cycle_xadesse colgó en local (macOS, sin el.dylibdel puente reciente). Conjust test-one-rust --lib <filtro>no pasa.CLAUDE.mddice que el pre-push correjust check-rustsi tocassrc-tauri, perolefthook.ymlya solo correfmt-checkystructural-guardsen pre-push.