La CA firma las claves públicas de las personas autorizadas y genera certificados con principals, restricciones, número de serie y una vigencia determinada. Los servidores solo necesitan la clave pública de la CA, un mapeo de principals y, opcionalmente, una lista de revocación.
Advertencia: una configuración incorrecta de sshd puede bloquear todo acceso remoto. Mantén una sesión SSH abierta, una clave de rescate funcional y acceso a la consola del proveedor durante la migración.Qué se va a construir
La solución tendrá:
- Una CA exclusiva para certificados de usuario.
- Claves privadas generadas y conservadas por cada usuario.
- Certificados de corta duración.
- Un principal funcional, como
ops. - Mapeo entre principals y cuentas Unix.
- Restricciones para forwarding y sesiones.
- Revocación mediante una KRL.
- Un procedimiento de rotación y recuperación.
Los certificados de usuario autentican personas ante servidores. Los certificados de host resuelven el problema inverso: permiten que los clientes autentiquen servidores. Deben utilizar CA diferentes. Certificados en ssh-keygen.
Cómo funciona la cadena de confianza
El flujo es:
- La persona genera una clave SSH en su estación.
- Entrega únicamente la clave pública a la CA.
- La CA comprueba la identidad y autorización solicitada.
- La CA firma la clave pública con principals y vigencia limitada.
- El cliente presenta el certificado y demuestra que posee la clave privada.
- El servidor verifica la firma, el principal, la vigencia y la revocación.
Ni la clave privada de la persona ni la clave privada de la CA deben copiarse a los servidores.
El certificado tampoco crea cuentas Unix, permisos sudo ni políticas de acceso. La cuenta destino debe existir y sus privilegios deben administrarse por separado.
Requisitos previos
Necesitas:
- OpenSSH Client y Server instalados.
- Acceso administrativo a un servidor de ensayo.
- Una consola alternativa o sesión SSH de rescate.
- Sincronización horaria operativa en CA, clientes y servidores.
- Un sistema para registrar solicitudes, seriales y revocaciones.
- Un equipo fuera de los servidores para custodiar la CA.
Comprueba las versiones:
ssh -V
sudo sshd -T >/dev/nullEl borrador utilizaba ssh-keygen --version, pero esa opción no es una comprobación portable. ssh -V muestra la versión del cliente y sshd -T valida y vuelca la configuración efectiva del servidor.
Comprueba el reloj:
timedatectl statusUna diferencia horaria puede hacer que un certificado todavía no sea válido o aparezca como expirado.
Paso 1: crear una CA para usuarios
Ejecuta este paso en un equipo protegido, preferiblemente desconectado o respaldado por un HSM.
umask 077
mkdir -p ~/openssh-user-ca
cd ~/openssh-user-caGenera la CA:
ssh-keygen \
-t ed25519 \
-a 64 \
-f user_ca \
-C "OpenSSH User CA - ejemplo.com"Introduce una passphrase robusta cuando ssh-keygen la solicite. No utilices -N "" para una CA productiva.
Se crearán:
user_ca # Clave privada: altamente sensible
user_ca.pub # Clave pública: se distribuye a los servidoresComprueba la huella:
ssh-keygen -lf user_ca.pubRegistra esa huella por un canal independiente. La clave privada debe tener acceso restringido, backups cifrados y un procedimiento de recuperación documentado.
Paso 2: generar una KRL inicial
RevokedKeys debe apuntar a un archivo legible y válido. Si el archivo falta o no puede leerse, sshd puede rechazar toda autenticación por clave pública.
Crea una especificación vacía:
install -m 600 /dev/null empty-krl.specGenera una KRL válida sin revocaciones:
ssh-keygen \
-k \
-f revoked_keys.krl \
-s user_ca.pub \
empty-krl.specComprueba su formato:
ssh-keygen -Q -l -f revoked_keys.krlLa KRL debe mantenerse junto al registro de seriales y distribuirse a todos los servidores de manera controlada.
Paso 3: preparar el servidor
Los ejemplos utilizan:
- Cuenta Unix:
admin. - Principal del certificado:
ops. - CA pública:
/etc/ssh/user_ca.pub. - Principals:
/etc/ssh/auth_principals/admin. - KRL:
/etc/ssh/revoked_keys.krl.
Confirma que la cuenta existe:
getent passwd adminInstala la clave pública de la CA y la KRL:
sudo install -o root -g root -m 0644 \
user_ca.pub /etc/ssh/user_ca.pub
sudo install -o root -g root -m 0644 \
revoked_keys.krl /etc/ssh/revoked_keys.krlNunca copies user_ca al servidor.
Crea el directorio para principals:
sudo install -d \
-o root -g root -m 0755 \
/etc/ssh/auth_principalsCrea /etc/ssh/auth_principals/admin con este contenido:
opsAplica permisos:
sudo chown root:root /etc/ssh/auth_principals/admin
sudo chmod 0644 /etc/ssh/auth_principals/adminEsto permite que un certificado con el principal ops autentique la cuenta Unix admin.
Paso 4: configurar sshd
Comprueba primero si la configuración principal incluye archivos adicionales:
sudo sshd -T | head
sudo grep -n '^Include' /etc/ssh/sshd_configSi la distribución admite /etc/ssh/sshd_config.d/, crea un archivo como:
/etc/ssh/sshd_config.d/60-user-ca.confContenido:
PubkeyAuthentication yes
TrustedUserCAKeys /etc/ssh/user_ca.pub
AuthorizedPrincipalsFile /etc/ssh/auth_principals/%u
RevokedKeys /etc/ssh/revoked_keys.krlTrustedUserCAKeys acepta una o varias claves públicas de CA. Cuando se configura AuthorizedPrincipalsFile, al menos uno de los principals del certificado debe aparecer en el archivo correspondiente a la cuenta destino. Referencia de sshd_config.
Durante la migración conserva:
AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2No desactives todavía contraseñas ni elimines las claves de rescate.
Paso 5: validar antes de recargar
Comprueba la sintaxis:
sudo sshd -tCuando el comando no imprime nada y devuelve código cero, la sintaxis es válida.
Comprueba la configuración efectiva para una conexión de ejemplo:
sudo sshd -T \
-C user=admin,host=servidor.ejemplo.com,addr=203.0.113.20 |
grep -E \
'pubkeyauthentication|trustedusercakeys|authorizedprincipalsfile|revokedkeys'Esto también ayuda a detectar directivas sobrescritas dentro de bloques Match.
Recarga el servicio correspondiente a tu distribución:
sudo systemctl reload sshEn distribuciones donde la unidad se llama sshd:
sudo systemctl reload sshdUna recarga normalmente conserva las sesiones existentes. No cierres la sesión administrativa actual.
Paso 6: generar la clave del usuario
La clave debe generarse en la estación de la persona:
ssh-keygen \
-t ed25519 \
-a 64 \
-f ~/.ssh/ana_ed25519 \
-C "[email protected]"La persona conserva:
~/.ssh/ana_ed25519Solo debe enviar a la CA:
~/.ssh/ana_ed25519.pubComprueba la huella de la solicitud:
ssh-keygen -lf ~/.ssh/ana_ed25519.pubLa CA debe verificar esa huella, la identidad de la persona, el principal solicitado, el alcance y la duración antes de firmar.

Paso 7: firmar el certificado
En el equipo de la CA:
ssh-keygen \
-s user_ca \
-I "[email protected]:ticket-1234" \
-n ops \
-V -5m:+8h \
-z 1042 \
-O clear \
-O permit-pty \
ana_ed25519.pubEl resultado será:
ana_ed25519-cert.pubSignificado de las opciones:
-s user_ca: clave privada utilizada para firmar.-I: identificador visible en los registros del servidor.-n ops: principal autorizado.-V -5m:+8h: válido desde cinco minutos antes hasta ocho horas después.-z 1042: serial único y no nulo.-O clear: elimina las extensiones permitidas por defecto.-O permit-pty: vuelve a permitir únicamente la asignación de terminal.
Con esta combinación no se habilitan agent forwarding, port forwarding, X11 forwarding ni ejecución de ~/.ssh/rc.
Si el acceso debe limitarse a una red conocida, puede añadirse:
-O source-address=203.0.113.0/24Es una opción crítica: úsala únicamente si el origen es estable. NAT, VPN o cambios de dirección pueden impedir el acceso.
Si no se especifica -V, OpenSSH genera certificados con una vigencia extremadamente amplia. Define siempre una ventana explícita. Las opciones y restricciones se describen en el manual oficial de ssh-keygen.
Paso 8: inspeccionar el certificado
Antes de entregarlo:
ssh-keygen -L -f ana_ed25519-cert.pubVerifica:
- Tipo
user certificate. - Huella de la CA.
- Key ID.
- Serial.
- Ventana de validez.
- Principal
ops. - Critical options.
- Extensions.
Registra como mínimo:
serial | key ID | huella | principal | emisión | expiración | solicitudLa persona puede recibir el certificado por un canal autenticado. El certificado es público, pero su integridad y procedencia deben verificarse.
Paso 9: configurar el cliente
Guarda el certificado junto a la clave privada:
~/.ssh/ana_ed25519
~/.ssh/ana_ed25519-cert.pubOpenSSH intenta descubrir automáticamente el archivo -cert.pub asociado a un IdentityFile. También puede declararse explícitamente en ~/.ssh/config:
Host servidor-ejemplo
HostName servidor.ejemplo.com
User admin
IdentityFile ~/.ssh/ana_ed25519
CertificateFile ~/.ssh/ana_ed25519-cert.pub
IdentitiesOnly yesIdentitiesOnly yes evita que el cliente ofrezca otras claves cargadas en el agente. Configuración oficial del cliente.
Aplica permisos:
chmod 600 ~/.ssh/ana_ed25519
chmod 644 ~/.ssh/ana_ed25519-cert.pubPaso 10: probar sin cerrar la sesión de rescate
Abre una segunda terminal:
ssh -vv servidor-ejemploEn el servidor, revisa los logs:
sudo journalctl -u ssh --since "10 minutes ago"O, según la distribución:
sudo journalctl -u sshd --since "10 minutes ago"Comprueba:
- Que se utilizó el certificado.
- Que la CA coincide.
- Que aparece el Key ID esperado.
- Que el principal fue aceptado.
- Que no se utilizó una clave antigua o contraseña.
Prueba también un certificado:
- Expirado.
- Con otro principal.
- Firmado por una CA no confiable.
- Revocado mediante KRL.
Paso 11: endurecer la autenticación
Solo después de comprobar varios usuarios, servidores y mecanismos de recuperación, evalúa:
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin noMantén temporalmente una clave de emergencia en authorized_keys, protegida por procedimiento, monitorización y acceso restringido.
No configures AuthorizedKeysFile none hasta completar la migración y comprobar el acceso de rescate desde la consola.
Antes de cada recarga:
sudo sshd -tRevocar un certificado
Supón que debe revocarse el serial 1042. Crea revoked.spec:
serial: 1042Actualiza la KRL:
ssh-keygen \
-k \
-u \
-f revoked_keys.krl \
-s user_ca.pub \
revoked.spec-u agrega la nueva revocación a la KRL existente.
Comprueba el certificado:
ssh-keygen \
-Q \
-f revoked_keys.krl \
ana_ed25519-cert.pubPara un certificado revocado, ssh-keygen informa REVOKED y devuelve un código distinto de cero. Un código cero significa que la clave consultada no está revocada. Listas KRL en OpenSSH.
Distribuye la KRL de forma atómica:
sudo install \
-o root -g root -m 0644 \
revoked_keys.krl \
/etc/ssh/revoked_keys.krl.new
sudo mv \
/etc/ssh/revoked_keys.krl.new \
/etc/ssh/revoked_keys.krlOpenSSH recomienda reemplazar este archivo de forma atómica y no modificarlo directamente mientras el servidor lo consulta.
La KRL bloquea nuevas autenticaciones. No termina sesiones SSH que ya estaban abiertas. Si el incidente lo exige, identifica y finaliza esas sesiones mediante el procedimiento de respuesta de la organización.
Expiración frente a revocación
Ambos mecanismos son complementarios:
- Vigencia corta: limita cuánto puede utilizarse un certificado olvidado o copiado.
- KRL: bloquea inmediatamente nuevas autenticaciones antes de que expire.
- Finalización de sesiones: responde a conexiones ya establecidas.
- Rotación de clave personal: necesaria cuando se compromete la clave privada del usuario.
Una CA no elimina la necesidad de un proceso de baja de personal, inventario de activos y respuesta a incidentes.
Rotar la CA
TrustedUserCAKeys puede contener varias claves públicas. Esto permite una rotación con solapamiento:
- Generar una CA nueva.
- Distribuir su clave pública junto a la anterior.
- Emitir certificados con la CA nueva.
- Comprobar clientes y servidores.
- Retirar la confianza en la CA anterior.
- Conservar registros y backups según la política definida.
Si la clave privada de la CA se compromete, la rotación normal no es suficiente: retira inmediatamente su clave pública de todos los servidores, activa el acceso de emergencia y emite nuevos certificados desde una CA segura.
CA de usuarios frente a CA de hosts
No reutilices la misma clave para ambos propósitos.
- La CA de usuarios firma claves de personas y es confiada mediante
TrustedUserCAKeys. - La CA de hosts firma claves de servidores con
ssh-keygen -h. - Los servidores configuran sus certificados mediante
HostCertificate. - Los clientes confían en la CA de hosts con una entrada
@cert-authorityenknown_hosts.
Separar ambas CA reduce el impacto de una filtración y evita confundir autenticación de personas con autenticación de servidores.
Rollback seguro
Durante la implementación:
- Conserva una sesión administrativa abierta.
- Mantén
authorized_keysy la clave de rescate. - Guarda una copia de la configuración anterior.
- No reinicies
sshdsi una recarga es suficiente. - Valida siempre con
sshd -t.
Si el acceso por certificado falla:
- Restaura la configuración anterior desde la consola o sesión abierta.
- Ejecuta
sudo sshd -t. - Recarga el servicio.
- Comprueba el acceso mediante la clave de rescate.
- Revisa CA, principal, vigencia, permisos y KRL antes de reintentar.
Problemas frecuentes
Certificate invalid: not yet valid o expired
Comprueba el reloj y la ventana del certificado:
date -u
ssh-keygen -L -f ~/.ssh/ana_ed25519-cert.pubEl principal no está autorizado
Compara:
ssh-keygen -L -f ~/.ssh/ana_ed25519-cert.pub
sudo cat /etc/ssh/auth_principals/adminAl menos un principal debe coincidir.
El cliente ofrece la clave, pero no el certificado
Comprueba:
ssh -G servidor-ejemplo |
grep -E 'identityfile|certificatefile|identitiesonly'Revisa el nombre ana_ed25519-cert.pub o configura CertificateFile.
Toda autenticación por clave pública dejó de funcionar
Revisa inmediatamente:
sudo sshd -t
sudo ls -l /etc/ssh/revoked_keys.krlUn archivo KRL ausente, ilegible o inválido puede provocar el rechazo general de claves públicas.
La configuración parece ignorarse
Comprueba la configuración efectiva y los bloques Match:
sudo sshd -T \
-C user=admin,host=servidor.ejemplo.com,addr=203.0.113.20Buenas prácticas para producción
- Mantén la CA privada fuera de los servidores.
- Utiliza CA diferentes para usuarios y hosts.
- Protege la CA mediante passphrase, HSM o token criptográfico.
- Emite certificados de corta duración.
- Usa seriales únicos y Key IDs trazables.
- Parte de
-O cleary habilita solo lo necesario. - Limita principals por función y cuenta destino.
- Distribuye CA públicas y KRL mediante gestión de configuración.
- Reemplaza las KRL de forma atómica.
- Conserva un acceso de emergencia auditado.
- Monitoriza Key ID, principal, serial, origen y cuenta destino.
- Ensaya revocación, rotación y recuperación periódicamente.

Conclusión
Una CA OpenSSH centraliza la confianza y permite emitir accesos temporales, trazables y restringidos sin distribuir cada clave pública a todos los servidores.
Su seguridad depende del proceso completo: proteger la CA, verificar solicitudes, limitar vigencia y capacidades, mapear principals correctamente, mantener una KRL actualizada y conservar un acceso de emergencia probado.