1 puntos por GN⁺ 2025-11-24 | 1 comentarios | Compartir por WhatsApp
  • En la versión Tahoe de macOS ahora se admite de forma nativa la creación y uso de claves SSH usando Secure Enclave
  • La biblioteca /usr/lib/ssh-keychain.dylib, además del PKCS11Provider para tarjetas inteligentes existente, implementa la interfaz SecurityKeyProvider, lo que permite comunicarse directamente con Secure Enclave en lugar de usar un dispositivo FIDO2
  • Con el comando sc_auth es posible crear claves con autenticación biométrica basada en Touch ID, y mediante ssh-keygen o ssh-add cargar y usar directamente claves desde la zona segura
  • Si se configura la variable de entorno SSH_SK_PROVIDER en .zprofile, SSH, ssh-agent y ssh-keygen la reconocen automáticamente
  • Sin herramientas externas, es posible implementar una estructura de autenticación SSH que combina seguridad y comodidad usando solo funciones nativas de macOS

Resumen del soporte de claves SSH basadas en Secure Enclave

  • macOS Tahoe admite la creación y uso de claves SSH basadas en Secure Enclave
    • Antes se necesitaban proyectos externos como secretive, pero ahora puede sustituirse con funciones nativas de macOS
  • /usr/lib/ssh-keychain.dylib implementa SecurityKeyProvider, permitiendo acceder a Secure Enclave de forma similar a un dispositivo FIDO2
  • Gracias a esto, es posible realizar autenticación SSH con el chip de seguridad integrado de macOS sin hardware externo como YubiKey

Creación y administración de claves

  • Con el comando sc_auth create-ctk-identity -l ssh -k p-256-ne -t bio se puede crear una clave de Secure Enclave que requiere autenticación con Touch ID
    • Con list-ctk-identities se puede ver la lista de claves creadas y sus hashes
    • Con delete-ctk-identity se pueden eliminar claves
  • Con la opción list-ctk-identities -t ssh se puede consultar la huella digital (fingerprint) de la clave SSH

Uso en SSH

  • Con el comando ssh-keygen -w /usr/lib/ssh-keychain.dylib -K -N "" se puede cargar un par de claves desde Secure Enclave
    • No es necesario ingresar PIN; la autenticación se hace con Touch ID
    • La “private key” generada no es la clave secreta real, sino un valor de referencia de credencial FIDO
  • Después de copiar la clave pública al servidor con ssh-copy-id,
    se puede conectar usando ssh -o SecurityKeyProvider=/usr/lib/ssh-keychain.dylib localhost

Integración con ssh-agent

  • Con ssh-add -K -S /usr/lib/ssh-keychain.dylib se puede registrar directamente una clave de Secure Enclave en ssh-agent
    • Las claves registradas pueden verificarse con ssh-add -L
    • Luego la autenticación se realiza con ssh -o SecurityKeyProvider=/usr/lib/ssh-keychain.dylib

Configuración predeterminada de SecurityKeyProvider

  • Puede indicarse directamente en .ssh/config o agregando en .zprofile
    export SSH_SK_PROVIDER=/usr/lib/ssh-keychain.dylib para reconocimiento automático
  • Después, simplemente con ssh-add -K o ssh my-server se puede hacer conexión SSH basada en clave de seguridad

Claves exportables (Exportable Keys)

  • Con sc_auth create-ctk-identity -l ssh-exportable -k p-256 -t bio se pueden crear claves exportables cifradas con Secure Enclave
    • Se pueden exportar como archivo PEM con export-ctk-identity y
      volver a registrar en otro dispositivo con import-ctk-identities
  • Este enfoque es algo menos seguro, pero conveniente para respaldos

Discusión de desarrolladores y ampliación del código

  • En los comentarios se discutió la posibilidad de usar la bandera .biometryCurrentSet
    • Por ahora solo se admite activar o desactivar el uso de autenticación biométrica, sin control más fino
  • El autor estudia la posibilidad de hacer ingeniería inversa (reverse-engineering) a ssh-keychain.dylib para añadir compatibilidad con biometryCurrentSet en la función sk_enroll()
  • El ejemplo de código propuesto requiere firmar el código (codesign) con una cuenta del Apple Developer Program para poder acceder a Secure Enclave
  • El código incluye lógica para generación de claves, firma y registro (sk_enroll, sk_sign, etc.), e implementa el proceso de crear y firmar con claves ECDSA P-256 dentro de Secure Enclave

Resumen

  • macOS ahora admite de forma nativa la autenticación SSH usando directamente Secure Enclave
  • La autenticación biométrica con Touch ID y una estructura compatible con FIDO2 mejoran la seguridad y la comodidad
  • Es posible administrar claves SSH solo con funciones integradas del sistema, sin hardware externo ni software adicional
  • Los desarrolladores están experimentando con ampliar ssh-keychain.dylib para lograr un control biométrico más detallado

1 comentarios

 
GN⁺ 2025-11-24
Opiniones en Hacker News
  • Si entendí bien, esto significa que no se puede respaldar la clave privada
    Como se guarda dentro del Secure Enclave, si pierdes la laptop, la clave también desaparece con ella
    Parece que solo se puede exportar la clave pública. Claro, quizá haya otros enfoques o un reseteo administrativo posible, pero aun así hay algo de eso que me inquieta
    Después el OP dijo que iba a responder y actualizar la página web

    • Basta con revisar man sc_auth. En lugar de generarla directamente en el Secure Enclave, se puede crear una clave cifrada exportable
      Con comandos de ejemplo como sc_auth create-ctk-identity -l ssh-exportable -k p-256 -t bio, y luego usar export-ctk-identity para crear un archivo .pem
      En otro dispositivo se puede volver a cargar con import-ctk-identities. Voy a agregar esto a la guía
    • La idea original no es “exportar” la clave. Cada vez que mueves una clave, aparece el riesgo de exposición
      La esencia de la PKI es mover solo la clave pública, y que la clave privada exista en un solo lugar
    • Sí. Conviene crear varias claves como respaldo
      Así la clave nunca se filtra bajo ninguna circunstancia
    • Que no se pueda exportar la clave privada es el mismo concepto que en una YubiKey
      Una clave privada generada en una YubiKey tampoco se puede respaldar
    • En principio, lo correcto es usar varias claves
      Lo ideal es tener una por dispositivo para que no haya problema si se pierde o roban alguno
      Yo guardo una YubiKey protegida con PIN en una caja fuerte. Así estoy cubierto incluso si desaparecen mi laptop, mi teléfono y mi YubiKey de uso diario
  • Yendo un poco más allá, también se puede hacer firma GPG basada en ECDSA
    Eso sí, por un bug se necesita GPG parcheado y un SSH agent
    Hay una versión empaquetada con UI para macOS (KeetaNetwork/agent),
    y el mismo backend también funciona en Linux con TPM vía PKCS#11
    La diferencia entre GPG y SSH es solo la forma de envolver claves y firmas; en el fondo todo es ECDSA

  • Secretive tiene una configuración más simple, pero voy a cambiarme a este método para usar una app menos
    En mi blog dejé cómo configurar claves SSH basadas en TPM en Windows 11

    • Me pregunto si en Linux también se pueden guardar ssh-key en el TPM
  • Es una función bastante genial
    Yo he usado Secretive durante mucho tiempo, y me resultó mucho más cómodo que una llave o tarjeta física
    Cada vez que se usa la clave SSH, hay que presionar un botón o autenticar con huella, así que queda claro cuándo se está usando
    Puedes mantener el túnel de ssh-agent y firmar git de forma segura incluso en servidores remotos
    Eso sí, la versión Tahoe tiene muchos bugs y se cuelga seguido. No he tenido tiempo de depurarla, así que la dejé así
    La UX de SSH basada en Smart Card me hizo sufrir en el pasado, pero si esto es estable, vale la pena probarlo

    • A mí también me gusta Secretive, pero la función de confirmación de ssh-agent ya existe en OpenSSH desde hace mucho
      Con ssh-askpass puedes confirmar cada uso de una clave privada. Eso sí, no distingue entre local y remoto
  • Ojo con esto, porque usa curvas sobre las que hay sospechas de que la NSA metió una puerta trasera

  • Si se guarda dentro del Secure Enclave, me pregunto por qué hace falta un archivo de clave privada

    • La implementación sk de OpenSSH funciona igual. Incluso con la opción de “resident key”, hace falta un archivo de clave privada
      Eso no es más que una referencia a la credencial FIDO; no contiene los datos reales de la clave secreta
      En las claves sk no residentes, el archivo es necesario porque el autenticador de hardware no guarda estado
      No tengo claro si la implementación de macOS guarda estado o no. Podría romperse al reinstalar el sistema operativo
  • Existe un proyecto llamado facebookincubator/sks
    Es una librería de golang que abstrae varias claves SSH basadas en hardware, con soporte para Linux, Windows y macOS

    • Pero con solo una librería de golang no funciona un ssh-agent
      Por eso hace tiempo empecé a crear yo mismo ssh-tpm-agent
  • Me gustaría firmar correos o archivos en el iPhone usando la misma clave privada
    Me pregunto si iCloud podría encargarse de eso

    • Estas claves no se sincronizan por iCloud
      En cambio, sí se sincronizan las Passkey. Habría que crear un nuevo SecurityKeyProvider que hable con la API de Passkey
      Las Passkey están ligadas a un bundle ID de app específico o a un dominio
      Por ejemplo, si Secretive soportara Passkey, ese par de claves no podría usarse en otras apps, pero
      sí se sincronizaría entre varios dispositivos de la misma app
  • Ya va siendo hora de agregar una nueva función a KeyMux
    Esta herramienta soporta claves enclave para SSH, SSL y PGP, y
    por ejemplo permite conectarse a un servidor Vault con un certificado SSL basado en Secure Enclave y realizar autenticación SSH con una clave privada de Vault no exportable
    Puedes verlo en keymux.com y en el enlace de la App Store