Windowsで作成された秘密鍵をMacで使用する際に注意すること
Development

Windowsで作成された秘密鍵をMacで使用する際に注意すること

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を変更してみる)
・秘密鍵の最終行に改行を入れ保存してみる

~~ END ~~