Сообщение об ошибке
Load key "/path/to/key": error in libcrypto
Также выводится как
- error in libcrypto
Путь — это файл ключа, который вы использовали. Некоторые повреждения дают вместо этого «Load key "…": invalid format» (например, у ключей PEM, в середине которых потеряна строка); причины пересекаются.
OpenSSH (ssh, ssh-add, ssh-keygen, git over SSH) — key file could not be parsed
Что это означает
OpenSSH не смог разобрать файл закрытого ключа в собственном формате и передал его OpenSSL (libcrypto) как ключ PEM, но и там разбор не удался — поэтому выводится общая ошибка «error in libcrypto», а не точная причина. В текущих версиях OpenSSH (проверено на 10.0) сюда приводит почти любое повреждение файла `OPENSSH PRIVATE KEY`: окончания строк Windows, отсутствие перевода строки в конце, потерянная строка или ключ, склеенный в одну строку. Сюда же попадают повреждённые ключи PEM/PKCS#8, если они обрезаны или склеены в одну строку, а также файлы PuTTY `.ppk`.
Почему это происходит
Окончания строк Windows (CRLF)
частоКлючи, вставленные в поля секретов CI, отредактированные в Windows или извлечённые из Git с `core.autocrlf`, получают окончания строк `\r\n`. Ключи в формате OpenSSH после этого не удаётся разобрать.
Обрезан завершающий перевод строки
частоМногие хранилища секретов и конструкции `echo -n`/`$(...)` отбрасывают завершающий перевод строки. Для ключей в формате OpenSSH уже одного этого достаточно, чтобы ключ не загрузился.
Строки потеряны, обрезаны или склеены
частоПеременные окружения, в которых переводы строк превращаются в пробелы, копирование из чата или ограничения на размер, из-за которых ключ обрезается.
Ключ не в формате OpenSSH или PEM
иногдаФайлы PuTTY `.ppk`, открытые ключи, сертификаты или JWK, указанные как файлы ключей, — это не те закрытые ключи, которые OpenSSH умеет читать.
Как исправить
- 1.
Записывайте ключи в CI байт в байт
Удалите `\r`, завершите файл переводом строки, задайте права 600 и сразу проверьте ключ через `ssh-keygen -y`, чтобы повреждённый секрет явно приводил к ошибке на шаге настройки.
bash # CI: write the key exactly, normalise line endings, guarantee the final newline, restrict permissions install -d -m 700 ~/.ssh printf '%s\n' "$SSH_PRIVATE_KEY" | tr -d '\r' > ~/.ssh/id_ed25519 chmod 600 ~/.ssh/id_ed25519 ssh-keygen -y -f ~/.ssh/id_ed25519 > /dev/null && echo "key parses" - 2.
Посмотрите, как оформлен файл
`file`, первая строка и последние байты сразу показывают окончания CRLF, отсутствующий перевод строки или ключ в одну строку.
bash file ~/.ssh/id_ed25519 # "OpenSSH private key" vs "with CRLF line terminators" head -1 ~/.ssh/id_ed25519; tail -c 40 ~/.ssh/id_ed25519 | od -c | tail -3 # framing and final "\n" wc -l ~/.ssh/id_ed25519 # a one-line file means the newlines were lost