先日サーバ上でキーペアを使用したssh接続で作業しようとしていたところ、OpenSSHで作った鍵の形式が違うことにより、ハマってしまったポイントが有ったので記事にまとめようと思います。 ※この記事ではPuTTy形式とOpenSSH形式の違いによる話は取り扱いません。
起きた事象
- OpenSSH形式の公開鍵、秘密鍵のキーペアが正しい状態である
- 公開鍵がサーバにauthoried_keysとして登録されていて、authorized_keysの場所権限ともに正しい状態
- サーバにsshでログインしようとすると認証ができない(厳密にはWordPressのプラグインインストールをsshでできない)
- 画面上のエラーメッセージ: 「{WPのユーザ}の公開鍵と秘密鍵が正しくありません」
/var/log/secure.log
のエラーメッセージには怪しいものは特に出ておらずクライアント側で接続を切ったとしか出ていない
sshd[6058]: Received disconnect from 127.0.0.1 port 47070:11: PECL/ssh2 (http://pecl.php.net/packages/ssh2) [preauth] sshd[6058]: Disconnected from 127.0.0.1 port 47070 [preauth]
結論
- OpenSSH7.8以降で生成した鍵は後方互換がなくクライアントによってはエラーが発生する
- パスフレーズが有る際のフォーマットが変わっているため対応していないクライアントではうまくパースできず接続できない状態になっている模様
- OpenSSH7.8以前で生成した秘密鍵の特徴
-----BEGIN RSA PRIVATE KEY-----
で始まる- パスフレーズで保護してると暗号化についての情報が表示される
- OpenSSH7.8以降で生成した秘密鍵の特徴
-----BEGIN OPENSSH PRIVATE KEY-----
で始まる- パスフレーズで保護しても暗号化についての情報が表示されなくなった
解決までの経緯
問題発見
起きてた事象としては、WordPressのプラグインインストールをsshで行おうとしていたときに発生しました。 サーバ上に登録していた鍵を指定してsshメソッドを使いプラグインをインストールしようとするも公開鍵と秘密鍵が正しくありませんと言われインストールできない。
仮説→検証
そこで、そもそも鍵が誤っているのかを確認するため、サーバ上でlocalhostにsshできるかを試してみるが、これは成功する。 つまりキーペア自体は正しく設定されておりssh認証できる状態であることがわかる。
ここでこの鍵は他のサーバでも使っているものの使いまわし(本当はあまり良くないが)であることを思い出し、新たに別の鍵を生成してそれで同様にWordpPressのプラグインインストールができるかを試してみた。 すると、この新しい鍵ではスムーズにプラグインのインストールができた。
根本原因調査
ということで鍵の何らかの違いによってうまくsshできない状態になっていると仮定して鍵の違いを調査した。
もともとあった秘密鍵は鍵の冒頭が -----BEGIN OPENSSH PRIVATE KEY-----
で始まっており、新しく作った秘密鍵は -----BEGIN RSA PRIVATE KEY-----
で始まっていた。
ということで2つの鍵の違いを調べたところクラスメソッドさんの記事が出てきて、OpenSSH7.8で鍵のフォーマットが変わっていることを知りました。
どうやらパスフレーズがあるときのフォーマットが変わっており、その変更のためにsshクライアント側でうまく考慮できていないとssh接続する前にエラーとなってしまい接続できないようになっているようでした。*1
解決
本来パスフレーズがあるときに暗号方式などが出ていたものを消すようにしたのはセキュリティ上の問題を少しでも低減する目的かと思いますが、今回はそもそもパスフレーズは設定していなかったので、もともとの形式に変換する方法を選択しました。 すでにある鍵ファイルを変換するために下記コマンドを使用しました。
ssh-keygen -p -m PEM -f id_rsa
これで変換した鍵ファイルを用いて再度WordPressのプラグインを試したところ無事成功しました。
めでたしめでたし。