TL / DR: ssh-keygen solo firma claves públicas. Sin embargo, intenta recuperarse de que se le pase una clave privada buscando una clave pública con el nombre adecuado automáticamente y no da ningún mensaje de advertencia.
Desafortunadamente, las claves SSH no implementan un tercero de confianza como lo hacen los certificados. Las claves SSH son bastante básicas, solo son "claves" como su nombre lo indica, sin todos los pitidos que puede encontrar en los certificados (los certificados son en realidad una clave envuelta en un contenedor que agrega información adicional, y la firma de la AC es parte de esto contenedor).
Si tuviera que encontrar una manera de manejar las claves SSH en un gran número de hosts, puede que le interese este hilo , donde se propone una solución para usar MonkeySphere que se basa en en la web de confianza OpenPGP para agregar conceptos confiables de terceros, incluido OpenSSH.
Editar: Tal como apareció en la discusión a continuación, openSSH agregó una función específica que implementa la firma de una clave pública usando una clave de CA de terceros.
El comando dado en la pregunta, " ssh-keygen -s ca.key -I dev1 dev1.key " no funciona porque, como se indica en la página de manual de ssh-keygen, dev1 .key debe ser una clave pública.
Sin embargo, cuando el archivo dado como parámetro no es una clave pública válida, antes de abandonar ssh-keygen verificará la existencia de un archivo llamado {filename} .pub que puede contener el esperado clave pública.
En el caso de las claves generadas con ssh-keygen, este archivo * .pub se genera automáticamente, por lo que al proporcionar el archivo de clave privada como parámetro, ssh-keygen retrocederá de forma transparente en el archivo de clave pública.
Sin embargo, los archivos clave generados manualmente a partir de certificados SSL no respetaron la misma convención (el archivo dev1.key no tenía su contraparte dev1.key.pub), y eso es lo que estaba fallando en este caso.
Edit 2: Comprobar este comportamiento es tan sencillo como ejecutar el comando a continuación
strace ssh-keygen -s ca.key -I dev1 dev1
El comportamiento que describo aparece aquí:
# First ssh-keygen try to open the file given as parameter:
...
open("dev1", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0600, st_size=1671, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f15ec1c0000
# Then it reads its content:
read(3, "-----BEGIN RSA PRIVATE KEY-----\n"..., 4096) = 1671
# Seeing it is not a public key, it closes it:
close(3) = 0
munmap(0x7f15ec1c0000, 4096) = 0
# Then he checks if a file with extension .pub exists:
open("dev1.pub", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=405, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f15ec1c0000
# If it exists, it reads it content too to check if it is a valid public key file:
read(3, "ssh-rsa AAAAB3NzaC1yc2EAAAADAQAB"..., 4096) = 405
# Yes it is, so now having read its content, it closes it and proceeds with
# creating the signed version of this public key (file 'dev1-cert.pub'):
close(3) = 0
munmap(0x7f15ec1c0000, 4096) = 0
open("dev1-cert.pub", O_WRONLY|O_CREAT|O_TRUNC, 0644) = 3
...