Сообщение об ошибке
Signature verification failed: incorrect signature
Также выводится как
- Couldn't verify signature: namespace does not match
- Could not verify signature.
Если принципала нет в файле разрешённых подписантов для этого ключа, выводится только «Could not verify signature.» (без предшествующей строки с подробностями).
OpenSSH ssh-keygen -Y verify (SSHSIG) — also used by Git for SSH-signed commits
Что это означает
`ssh-keygen -Y verify` проверил подпись SSHSIG, и криптографическая проверка не прошла: данные, прочитанные со стандартного ввода, не совпадают в точности с подписанными, или подпись создана другим ключом. SSH-подписи также привязаны к пространству имён (`file`, `git`, `email`…); подпись, которую проверяют в другом пространстве имён, ещё до криптографической проверки даёт ошибку «namespace does not match». После каждой из этих ошибок выводится «Could not verify signature.».
Почему это происходит
Проверяемые данные отличаются от подписанных
частоИзменённый файл, другие окончания строк (`\r\n` или `\n`), завершающий перевод строки, добавленный редактором, или проверка не того файла. SSHSIG подписывает хеш, вычисленный по точным байтам данных.
Не то пространство имён
частоПодписи, созданные с `-n file`, нельзя проверить с `-n git`, а Git всегда использует `git`. Пространства имён не дают повторно использовать подпись, созданную для одной цели, для другой.
Принципала или ключа нет в allowed_signers
иногдаВ `-I` указан принципал, которого файл разрешённых подписантов не связывает с ключом подписи, или ключ сменили при ротации, а в файле всё ещё указан старый.
Как исправить
- 1.
Проверьте исходные байты с правильным пространством имён
Передайте исходный файл на стандартный ввод `ssh-keygen -Y verify` и используйте то же пространство имён, что и при подписи. `find-principals` показывает, какому принципалу соответствует ключ.
bash # Verify exactly the bytes that were signed, with the namespace used at signing time ssh-keygen -Y verify -f allowed_signers -I release@example.com -n file -s release.txt.sig < release.txt # Which principal does the allowed_signers file map this signature's key to? ssh-keygen -Y find-principals -f allowed_signers -s release.txt.sig - 2.
Отделите криптографию от доверия
`check-novalidate` проверяет подпись, не обращаясь к файлу разрешённых подписантов. Если проверка проходит, проблема в сопоставлении ключей и принципалов; если нет — неверны данные или подпись.
bash ssh-keygen -Y check-novalidate -n file -s release.txt.sig < release.txt # signature valid at all (no trust check)?
Связанные ошибки
error: gpg.ssh.allowedSignersFile needs to be configured and exist for ssh sign…Git (verify-commit, log --show-signature, merge --verify-signatures) with gpg.format=sshinvalid signature when validating ASN.1 encoded signatureSigstore cosign (verify-blob / verify with --key)gpg: BAD signature from "Release Bot <release@example.com>" [ultimate]GnuPG (gpg --verify, git verify-commit / verify-tag)