エラーメッセージ
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 は秘密鍵ファイルを独自形式として解析できず、次に PEM 形式の鍵として OpenSSL(libcrypto)に渡しましたが、そちらも失敗しました。そのため、報告されるエラーは具体的な理由ではなく、汎用の「error in libcrypto」になります。現行の OpenSSH(10.0 で確認)では、`OPENSSH PRIVATE KEY` ファイルの損傷はほぼすべてここに行き着きます。Windows の改行コード、末尾の改行の欠落、行の欠落、1 行にまとめられた鍵などです。損傷した PEM/PKCS#8 の鍵も、切り詰められたり 1 行にまとめられたりした場合はここに行き着き、PuTTY の `.ppk` ファイルも同様です。
発生する理由
Windows の改行コード(CRLF)
よくあるCI のシークレットの入力欄に貼り付けた鍵、Windows で編集した鍵、`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 の改行、改行の欠落、1 行にまとめられた鍵がすぐにわかります。
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