エラーメッセージ
Load key "/path/to/key": invalid format
パスは実行のたびに埋め込まれます。文言は、OpenSSH のビルドに使われた暗号ライブラリによって異なります。OpenSSL 1.1 または LibreSSL(macOS)では、以下のどの失敗でも「invalid format」と出力されます。OpenSSL 3 でビルドされたもの(Ubuntu 22.04 以降、Debian 12 以降)では、ほとんどの場合「error in libcrypto」と出力され、損傷した PEM 形式の鍵の場合だけ「invalid format」のままです。本文の中の文字が 1 文字変わった場合は、どのビルドでも「unknown or unsupported key type」となります。
OpenSSH — ssh, ssh-keygen, ssh-add
このエラーの意味
OpenSSH は秘密鍵ファイルを読み込もうとしましたが、既知のどの形式(OPENSSH PRIVATE KEY、PKCS#8、従来の PEM)としても解析できませんでした。ファイルが壊れているか、途中で切れているか、PuTTY の .ppk のような別の形式であるか、そもそも秘密鍵ではないかのいずれかです。これはファイル形式の問題であり、パスフレーズの入力やサーバーとのやり取りより前の段階で発生しています。
発生する理由
コピーと貼り付けで鍵が壊れた
よくあるチャット、メール、ターミナルを経由した鍵は、末尾の改行が失われたり、行が折り返されたり、スマートクォートのような自動置換文字が入り込んだり、最後のダッシュが欠けたりします。OPENSSH PRIVATE KEY ブロックの base64 の本文は長さの違いに敏感で、1 文字失われるだけでファイル全体が無効になります。(末尾の改行がないことだけでも、典型的な原因になります。)
OpenSSH で PuTTY の .ppk ファイルを使っている
よくあるPuTTY の鍵形式(「PuTTY-User-Key-File-2: ...」)は OpenSSH の形式とは異なります。ssh -i で .ppk を指定すると、まさにこの段階で失敗します。鍵を一度変換する必要があります。
秘密鍵を指定すべき場所に公開鍵を指定している
よくあるssh -i id_ecdsa.pub(.pub ファイル)を指定した場合や、authorized_keys の行を秘密鍵ファイルとして保存した場合です。秘密鍵のローダーは公開鍵の内容を見つけ、「invalid format」を報告します。
途中で切れた、または同期が不完全なファイル
ときどきクラウド同期や中断された scp によって本文の途中で切れた鍵ファイルは、意味のないデータとして解析されます。再現確認:有効な鍵ファイルを切り詰めると、OpenSSH 8.4 でも macOS でも、まさに「invalid format」になります。
修正方法
- 1.
まずフレーミングを確認する
先頭行と末尾行に加えて、有効性のチェック(-y は、秘密鍵を解析できた場合に限り公開鍵を出力します)を行えば、失敗の種類を数秒で特定できます。
bash head -1 ~/.ssh/id_ecdsa # -----BEGIN OPENSSH PRIVATE KEY----- tail -c 50 ~/.ssh/id_ecdsa | xxd | tail -1 # must end with 0a (newline) ssh-keygen -y -f ~/.ssh/id_ecdsa # parses? prints the public key - 2.
PuTTY の鍵を OpenSSH 形式に変換する
puttygen で一度変換すれば、その後は ssh、ssh-add、ssh-agent で鍵を使えます。
bash puttygen key.ppk -O private-openssh -o ~/.ssh/id_converted chmod 600 ~/.ssh/id_converted - 3.
鍵を損なわずに転送する
鍵ファイルはクリップボードではなく scp/rsync で移動し、パーミッションを 600 に保ってください。秘密鍵を復旧できない場合は、新しい鍵ペアを生成してください。最近の OpenSSH では Ed25519 が推奨されています。
bash scp -p old-host:~/.ssh/id_ecdsa ~/.ssh/ # or start clean: ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519