この前からGitHubのレポジトリへgit push
しようとすると
key_load_public: invalid format
という注意が出てくるようになりました。
ただ、それでもpush
自体は出来るのですが、
ちょっと何が原因か調べてみました。
出る環境
最近El CapitanにアップデートしたMacです。
コマンドとかのバージョンなどは
$ which git
/usr/local/bin/git
$ git --version
git version 2.6.1
hub version 2.2.1-g64187e3
$ which ssh
/usr/bin/ssh
$ ssh -V
OpenSSH_6.9p1, LibreSSL 2.1.7
$ which openssl
/usr/local/opt/openssl/bin/openssl
$ openssl version
OpenSSL 1.0.2d 9 Jul 2015
こんな感じ。
OS X 10.11 El Capitanにアップデート: やったこととか気になってることとか
でも書いたようにopenssl
に関して、
Homebrewで/usr/local/opt/にインストールしたものを使える様にパスを通してあります。
他にもgitをHomebrewバージョンで使っています。(さらにそれを hub でラップしています。)
これでpush
をしてみたり、認証をテストしてみようとすると、
$ ssh -T [email protected]
key_load_public: invalid format
Hi rcmdnk! You've successfully authenticated, but GitHub does not provide shell access.
こんな感じで key_load_public: invalid formatと出ますが、 認証自体は上手く行ってる感じです。
また、GitHub以外の例えばBitBucketなんかにpushしようとするとこの注意は出ません。
他にも鍵認証でssh
してる所はありますが、それに関しても出ません。
詳しく見てみる
まず、gitをMacオリジナル・バージョン(/usr/bin/git: 2.3.8)で試してみましたが変わらず。
次にOpenSSLのパス(/usr/local/opt/openssl/bin/)をPATH
から外してみると、
上の注意が出なくなりました。
Macオリジナルのopensslは
$ /usr/bin/openssl version
OpenSSL 0.9.8zg 14 July 2015
となっています。
というわけで、 OpenSSL 1.0.2が原因の様。
これを見るとprivate keyの最初と最後に書いてある
-----BEGIN RSA PRIVATE KEY-----
....
-----END RSA PRIVATE KEY-----
の-----
の行を消せば何も言われなくなるよ、とあります。
実際に消してみるとこの注意は出てこなくなり、 認証もそのまま上手く行ってます。
もうちょっと見てみると、
ssl - How to convert a private key to an RSA private key? - Stack Overflow
ASN.1 key structures in DER and PEM - Knowledge Base - mbed TLS (Previously PolarSSL)
こんな情報に当たりました。
簡単に言うと、このBEGIN RSA PRIVATE KEYで始まる様な形式は古く、
新しいものであればBEGIN PRIVATE KEYの様にRSA
無しになっている、とのこと。
その違いは、RSA無しの場合、エンコードされた中身のデータの中に 暗号化のアルゴリズムやそのバージョン情報などが入っていて、 それによって様々な形式である可能性があるのに対し、 RSAの付いた物は絶対にRSAであり、その様な情報が付いていない、と。
なので、情報がない時でもRSAだと思えば読めるわけで、 新しいものでも読める様です。
-----
の部分がどれだけ重要な意味を持っているかよく分かってないのですが、
取り敢えずそこを見てチェックして、思ってるのと違う、と言う注意を出すものの、
中身に関しては、アルゴリズム情報が無さそうと見るや、RSAであると思って
解釈して上手くやっている、と言う感じでしょうか?
ただ、相手サーバー側によってもこれが出たり出なかったりするので、 相手側に送ってそのレスポンスに対する処理の所で起こっている感じでもあるのですが、 ちょっともう追いかけられてないです。
解決法
上に書いたように-----
の部分を消したり、
新しいopensslを使って鍵を作りなおしたりすれば治りますが、
取り敢えず、ということでMacに元々入ってるopensslを使うことにしました。
解決法、と言うか、自分で敢えて設定したものを無くすだけですが、 Opensslのライブラリが他のパッケージのインストールに必要だったので
1 2 3 4 5 6 7 |
|
今感じの設定を
.bashrcに書いてましたが、
この中で、PATH
に関しては敢えて必要ないので、
コメントアウトするなり消すなりしておきます。
1 2 3 4 5 6 7 |
|
これで、
/usr/local/opt/openssl/bin/openssl
ではなく
/usr/bin/openssl
を使う様になるので上の様な注意は出なくなります。