Помимо ssh и sshd, в OpenSSH входит ssh-keygen, который генерирует и преобразует ключи, а с -Y sign создаёт подписи SSHSIG для файлов и коммитов git. Факты на этой странице проверены на пакетах 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 не выводит ни одного постквантового алгоритма подписи, поэтому аутентификация хоста и пользователя остаётся классической. RSA с SHA-1 (ssh-rsa) по-прежнему реализован, но отсутствует в списках алгоритмов ключей хоста и открытых ключей по умолчанию, поэтому с настройками по умолчанию клиент его никогда не использует; для стороны, которая не предлагает ничего новее ssh-rsa, его нужно явно включить снова, например директивой PubkeyAcceptedAlgorithms +ssh-rsa для пользовательских ключей. Какие алгоритмы согласует сервер, проверьте в аудите SSH-сервера.
Подпись ECDSA в SSH — это ни DER, ни raw r‖s: blob состоит из строки ecdsa-sha2-nistp256, за которой следует строка с r и s в виде чисел SSH mpint (RFC 5656). Поэтому преобразование подписей в X.509, JWS или WebAuthn и обратно требует сменить кодировку двух целых чисел. Nonce случайны (две подписи одного файла различались), 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» для повреждённого blob и «incorrect signature» для верной подписи других данных, а stdout в обоих случаях выводит «Could not verify signature.» Проверьте подпись в инструменте проверки SSH-подписей.
ssh-keygen -e -m PKCS8 экспортирует открытый ключ в SPKI PEM, а -i -m PKCS8 импортирует его обратно; -m PEM тоже даёт SPKI для ECDSA, но PKCS#1 для RSA, а -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.