sftp接続する際に、Windowsで作成された秘密鍵がMacで使用できなかったときの対処方法を備忘録的に紹介します。
経緯
先方で作成、セットアップされたサーバーへ、先方が作成した秘密鍵を受け取ってsftpログインを試みたができない。1時間ほど試行錯誤してやっと解決。
秘密鍵
ファイルを開くと、
-----BEGIN OPENSSH PRIVATE KEY-----
で始まり、
-----END OPENSSH PRIVATE KEY-----
で閉じている。
調べてみるとOpenSSH 7.8から記載形式が変更になったらしい。
エラー
秘密鍵のパーミッションを600に変更し、~/.ssh/に配置。
以下のコマンドでsftp接続を試みる
$ sftp -oPort=22 -oIdentityFile=~/.ssh/{秘密鍵の名前}.pem {アカウント名}@{サーバアドレス}
しかしエラー
Load key "秘密鍵の名前": invalid format
{アカウント名}@{サーバアドレス}: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
Connection closed
invalid format = 無効な形式なので、そもそも秘密鍵としての形式として認識されていない。
原因・解決
改行コードをLFに変更する
「秘密鍵 windows mac フォーマット」みたいなワードで調べてみると同じ原因かと思われる記事を発見。https://www.mtioutput.com/entry/ssh-invalid-format
改行コードには3種類あるらしい。
CR(Carriage Return)
カーソルを左端の位置に戻す
→macOS(9以前)で使用
LF(Line Feed)
新しい行に移動する
→Unix、Linux、macOS(9以降)、Androidで使用
CR-LF(CR+LF)
左端の位置に戻し、新しい行に移動する
→MS-DOS、Windowsで使用
3種類のうち、改行コードがLFになっていれば良いらしい?ただ記事内で使用しているnkfコマンドがMacにはなかったのでHomebrewでインストール
$ brew install nkf
インストール後文字コードを確認。やはり改行コードがwindows形式(CRLF)になっている
$ nkf --guess {秘密鍵名}.pem
ASCII (CRLF)
unix形式(LF)に変換します
$ nkf -Lu {秘密鍵名}.pem > {新しい秘密鍵名}.pem
$ nkf --guess {新しい秘密鍵名}.pem
ASCII (LF)
最終行に改行を入れる
無事改行コードが変換されたのでもう一度sftpを試みたところ同じinvalid formatエラー。。
ここからまたハマったのですが、ファイルを開き最終行の「-----END OPENSSH PRIVATE KEY-----」の後ろでさらに改行して保存することで無事invalid formatエラーがでなくなり、sftpログインができるようになりました。
なぜ最終行に改行を入れるとエラーが発生しなくなるのかが謎ですが、ひとまず秘密鍵の読み込みでエラーが発生した場合は以下を疑ってみると良いと思います。
・そもそもauthorized_keysに配置された公開鍵と対になっている秘密鍵か
・秘密鍵のパーミッションは600になっているか
・秘密鍵の改行コードは正しいものになっているか(環境によってはCRLF、LFを変更してみる)
・秘密鍵の最終行に改行を入れ保存してみる