TL/DR: ssh-keygen only signs public keys. However, it tries to recover from being passed a private key by looking for an appropriately named public key automatically and gives no warning messages.
Sfortunatamente, le chiavi SSH non implementano terze parti attendibili come fanno i certificati. Le chiavi SSH sono piuttosto semplici, sono solo "chiavi" come suggerisce il nome, senza tutti i campanelli e fischietti che si possono trovare nei certificati (i certificati sono in realtà una chiave racchiusa in un contenitore che aggiunge informazioni supplementari e la firma della CA è parte di questa contenitore).
Dovresti trovare un modo per gestire le chiavi SSH su un gran numero di host, potresti essere interessato a questo thread , dove viene proposta una soluzione per utilizzare MonkeySphere che si basa sulla rete di fiducia di OpenPGP per aggiungere concetti di terze parti affidabili incluso OpenSSH.
Modifica: Come è stato mostrato nella discussione di seguito, openSSH ha aggiunto una funzione specifica che implementa la firma di una chiave pubblica utilizzando una chiave CA di terze parti.
Il comando indicato nella domanda " ssh-keygen -s ca.key -I dev1 dev1.key " non funziona perché, come dichiarato nella manpage ssh-keygen, dev1 .key deve essere una chiave pubblica.
Tuttavia, quando il file fornito come parametro non è una chiave pubblica valida, prima di rinunciare a ssh-keygen verificherà l'esistenza di un file denominato {nomefile} .pub che potrebbe contenere l'attesa chiave pubblica.
Nel caso di chiavi generate usando ssh-keygen, questo file * .pub viene generato automaticamente, quindi quando si fornisce il file della chiave privata come parametro ssh-keygen verrà ripiegato in modo trasparente sul file della chiave pubblica.
Tuttavia, i file chiave generati manualmente dai certificati SSL non rispettavano la stessa convenzione (il file dev1.key non aveva la sua controparte dev1.key.pub), e questo è ciò che stava fallendo in questo caso.
Modifica 2: il controllo di questo comportamento è semplice come avviare il comando di seguito
strace ssh-keygen -s ca.key -I dev1 dev1
Il comportamento che descrivo appare qui:
# 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
...