Além de ssh e sshd, o OpenSSH traz o ssh-keygen, que gera e converte chaves e, com -Y sign, produz assinaturas SSHSIG para arquivos e commits do git. Os fatos desta página foram verificados nos pacotes do Alpine 3.24.2, OpenSSH 10.3p1, vinculado ao OpenSSL 3.5.8 da imagem. Sem -t, o ssh-keygen grava uma chave Ed25519. Chaves ECDSA existem apenas para P-256, P-384 e P-521 (-b 224 é recusado), não há Ed448, e o DSA foi removido: ssh-keygen -t dsa responde “unknown key type dsa”. Inspecione qualquer chave com o inspetor de chaves SSH.
Sem arquivo de configuração, o cliente oferece primeiro a troca de chaves híbrida mlkem768x25519-sha256 e depois sntrup761x25519-sha512 — proteção pós-quântica para as chaves de sessão. ssh -Q sig não lista nenhum algoritmo de assinatura pós-quântico, então a autenticação do host e do usuário continua clássica. O RSA com SHA-1 (ssh-rsa) ainda está implementado, mas fica fora das listas padrão de chaves de host e de chaves públicas, então, com as configurações padrão, o cliente nunca o usa; uma contraparte que não ofereça nada mais recente que ssh-rsa exige reativá-lo explicitamente, por exemplo com PubkeyAcceptedAlgorithms +ssh-rsa para chaves de usuário. Confira o que um servidor negocia com a auditoria de servidores SSH.
Uma assinatura ECDSA no SSH não é DER nem r‖s bruto: o blob é a string ecdsa-sha2-nistp256 seguida de uma string que contém r e s como mpints do SSH (RFC 5656). Converter assinaturas de ou para X.509, JWS ou WebAuthn, portanto, significa refazer a codificação dos dois inteiros. Os nonces são aleatórios — duas assinaturas do mesmo arquivo foram diferentes —, o s não é normalizado, e uma assinatura com s substituído por n − s passou na verificação.
As assinaturas SSHSIG (ssh-keygen -Y sign) calculam o hash da mensagem com SHA-512 por padrão; -O hashalg=sha256 é a única alternativa, e SHA-1 e SHA-384 são recusados. O namespace indicado com -n faz parte do que é assinado, e verificar uma assinatura file como email falha com “namespace does not match”. As falhas podem ser distinguidas no stderr — “invalid format” para um blob danificado, “incorrect signature” para uma assinatura válida sobre outros dados —, enquanto o stdout diz “Could not verify signature.” nos dois casos. Confira uma assinatura com o verificador de assinaturas SSH.
ssh-keygen -e -m PKCS8 exporta uma chave pública como SPKI em PEM, e -i -m PKCS8 a importa de volta; -m PEM também gera SPKI para ECDSA, mas PKCS#1 para RSA, e -m RFC4716 gera o formato “SSH2 PUBLIC KEY”. Chaves públicas Ed25519 não podem ser exportadas com -e -m PKCS8 (“unsupported key type ED25519”), embora -p -m PKCS8 regrave uma chave privada Ed25519 como PKCS#8. As chaves privadas são armazenadas como OPENSSH PRIVATE KEY por padrão; -p -m PEM regrava chaves ECDSA como SEC1 e chaves RSA como PKCS#1, e -m PKCS8 com frase secreta grava PKCS#8 criptografado.