秘密鍵を読み込もうとしたら Invalid format で怒られた、という話です。
結論だけ先に書くと、ファイル末尾に空行を1行入れて保存し直すだけで解決しました。
何が起きたか
VPS に SSH で接続するための秘密鍵を、チームメンバーに共有したときの話です。
複数人でサーバーを操作する必要があったので、秘密鍵をチャットで送って各自の端末に保存してもらいました。
自分の環境では普通に接続できているのに、受け取った側で ssh しようとすると、こんなエラーが出る。
Load key "/path/to/key": invalid format
鍵自体は正しく生成したもので、ファイルの中身を見ても壊れている様子はない。
パーミッションも 600 にしてある。なのに invalid format と言われる。
受け取った側で何か変なことをしたのかと思ったんですが、そうでもない。 チャットからコピペして保存しただけ。
原因
PEM 形式の秘密鍵は、末尾に改行(LF)が必要です。
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXkAAA...
...
-----END OPENSSH PRIVATE KEY-----
(ここに空行が要る)
-----END OPENSSH PRIVATE KEY----- の直後にファイルが終わっていると、SSH クライアントが正しく読めません。
チャットでコピペしたときに末尾の改行が落ちた、というのが今回の原因でした。 テキストをコピーすると末尾の空行って消えがちなので、まあそうなるよなという感じです。
対処
ファイルの末尾に空行を1行足して保存する。それだけです。
# 末尾に改行があるか確認
xxd 鍵ファイル | tail -1
末尾が 0a(LF)で終わっていなければ、改行がありません。
# 改行を足す
echo "" >> 鍵ファイル
もしくはエディタで開いて、最終行の下にカーソルを持っていって、空行があることを確認して保存すれば OK です。
これで ssh し直したら、普通につながりました。
地味にハマるやつ
鍵の中身は正しいのに読み込めないので、「鍵が壊れた?」「生成し直す?」と無駄に時間を使いがちです。
しかもエラーメッセージが invalid format としか言ってくれないので、末尾の改行なんてまず疑わないんですよね。
今回みたいにチャット経由で鍵を共有する場面に限らず、エディタで開いて保存し直したタイミングで末尾の改行が消えることもあります。
嘘だと思って、まず末尾に空行を入れてみてください。これだけで直ったら儲けものです。