概要
いつも使っていた id_rsa ファイルの中身をコピーして、新しく用意したサーバに設置したところ、なぜかそのサーバでだけ ssh アクセスが失敗した。
今まで使っていたサーバやローカルマシンからは、全く同じ ssh 秘密鍵でアクセスできる状況だったので、鍵ファイルには問題はないことがわかっていた。
このような状況で、原因がわからず困っていたが、対処できたので方法を共有する。
エラー発生状況
私の場合は git を使っていてエラーになりました。
実際に発生したエラーは以下のようなもの。
$ git clone git@github.com:siruku6/repo_name.git
Cloning into 'repo_name'...
Load key "/home/ubuntu/.ssh/id_rsa": error in libcrypto
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
対策
手順として、以下の方法を取ります。
1. ファイルの正しさの確認
1-1. ファイル文字数の確認
以下のコマンドを、元のファイルとコピー後のファイル、両方に対して実行します。
結果が同じでなければ、当然おかしいですね。
wc -c ~/.ssh/id_rsa
私の場合は、ここで文字数に差が生じていたので、実はファイルに問題が発生していたことがわかりました。具体的には、問題のあるサーバに設置した id_rsa は「1文字だけ少ない」という状況でした。
1-2. ハッシュ値の確認
以下のコマンドを、元のファイルとコピー後のファイル、両方に対して実行します。
この結果も当然同じでなければ、コピー後のファイルに問題があるということになります。
sha256sum ~/.ssh/id_rsa
文字数が異なる場合は、こちらも異なる値になると思います。
1-3. ファイルの形式を確認
以下のコマンドで確認できます。
file ~/.ssh/id_rsa
1-4. 改行の統一
CRLF とか LF とか、そういうやつです。複数の環境間でコピーとかペーストしたりしていると、改行コードが変わることがあります。これを統一するためのコマンドです。
sed -i 's/\r$//' ~/.ssh/id_rsa
2. 最終チェック
2-1. パーミッションの変更
このコマンドで、秘密鍵として正しいパーミッション (600) を設定しましょう
chmod 600 ~/.ssh/id_rsa
ここまでの確認とパーミッション変更ができていたら、少なくとも、元のうまく使える鍵とコピー後の鍵は同一になっているはずです。
これでも問題が起きるようであれば、 ssh のパッケージや、ネットワークなど、環境側の問題を疑う必要があるかもしれません。(その場合は、エラーメッセージが変わっているかと思いますが)
参考記事
秘密鍵の最後に、改行が無い時に出るエラー
鍵ファイルの最後に、ひとつ改行が必要なようです。
文字数チェックで不一致があった方は、こちらを疑って対処しても良いかもしれません。
詳細は次の記事を確認してください( ˘ω˘)スヤァ...