OpenSSH には、ssh と sshd のほかに、鍵を生成・変換し、-Y sign を指定するとファイルや git コミットに対する SSHSIG 署名も作成する ssh-keygen が含まれています。ここに挙げる事実は、Alpine 3.24.2 のパッケージである OpenSSH 10.3p1(イメージの OpenSSL 3.5.8 にリンク)で確認したものです。-t を指定しないと、ssh-keygen は Ed25519 の鍵を書き出します。ECDSA の鍵は P-256、P-384、P-521 でしか作成できず(-b 224 は拒否されます)、Ed448 はなく、DSA は削除されています。ssh-keygen -t dsa は「unknown key type dsa」と応答します。どの鍵も SSH キーインスペクターで解析できます。
設定ファイルがない場合、クライアントはハイブリッド鍵交換の mlkem768x25519-sha256 を最初に提示し、次に sntrup761x25519-sha512 を提示します。これにより、セッション鍵はポスト量子の保護を受けます。ssh -Q sig にはポスト量子署名アルゴリズムが 1 つもないため、ホスト認証とユーザー認証は従来の方式のままです。SHA-1 を使う RSA(ssh-rsa)は現在も実装されていますが、デフォルトのホスト鍵と公開鍵のアルゴリズム一覧に含まれていないため、デフォルト設定のクライアントがこれを使うことはありません。ssh-rsa より新しいものを何も提示しない相手に対しては、明示的に再有効化する必要があります。たとえばユーザー鍵の場合は PubkeyAcceptedAlgorithms +ssh-rsa を指定します。サーバーが何をネゴシエートするかは SSH サーバー監査で確認してください。
SSH の ECDSA 署名は DER でも生の r‖s でもありません。その署名データは、文字列 ecdsa-sha2-nistp256 のあとに、r と s を SSH の mpint として格納した文字列が続く構造です(RFC 5656)。そのため、X.509、JWS、WebAuthn との間で署名を変換するには、2 つの整数をエンコードし直す必要があります。nonce はランダムで(1 つのファイルに対する 2 つの署名は異なりました)、s は正規化されず、s を n − s に置き換えた署名も検証を通りました。
SSHSIG 署名(ssh-keygen -Y sign)は、デフォルトでメッセージを SHA-512 でハッシュ化します。代わりに使えるのは -O hashalg=sha256 だけで、SHA-1 と SHA-384 は拒否されます。-n で指定した名前空間は署名対象の一部であり、file の署名を email として検証すると「namespace does not match」で失敗します。失敗の種類は stderr で区別でき、壊れたデータには「invalid format」、別のデータに対する有効な署名には「incorrect signature」と表示されますが、stdout はどちらの場合も「Could not verify signature.」と出力します。署名は SSH 署名検証ツールで確認してください。
ssh-keygen -e -m PKCS8 は公開鍵を SPKI の PEM としてエクスポートし、-i -m PKCS8 でそれをインポートし直せます。-m PEM でも ECDSA では SPKI になりますが、RSA では PKCS#1 になり、-m RFC4716 では「SSH2 PUBLIC KEY」形式になります。Ed25519 の公開鍵は -e -m PKCS8 ではエクスポートできませんが(「unsupported key type ED25519」)、-p -m PKCS8 で Ed25519 の秘密鍵を PKCS#8 に書き換えることはできます。秘密鍵はデフォルトで OPENSSH PRIVATE KEY として保存されます。-p -m PEM は ECDSA の鍵を SEC1 に、RSA の鍵を PKCS#1 に書き換え、パスフレーズ付きの -m PKCS8 は暗号化された PKCS#8 を書き出します。