rcmdnk's blog

OpenSSL―暗号・PKI・SSL/TLSライブラリの詳細―

この前から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が原因の様。

[SOLVED] openssh 6.7p1 warning “key_load_public: invalid format” / Networking, Server, and Protection / Arch Linux Forums

これを見るとprivate keyの最初と最後に書いてある

-----BEGIN RSA PRIVATE KEY-----
....
-----END RSA PRIVATE KEY-----

-----の行を消せば何も言われなくなるよ、とあります。

実際に消してみるとこの注意は出てこなくなり、 認証もそのまま上手く行ってます。

もうちょっと見てみると、

ssl - How to convert a private key to an RSA private key? - Stack Overflow

java - what is the differences between “BEGIN RSA PRIVATE KEY” and “BEGIN 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のライブラリが他のパッケージのインストールに必要だったので

.bashrc
1
2
3
4
5
6
7
# Openssl
OPENSSL_PATH=/usr/local/opt/openssl
if [ -d "$OPENSSL_PATH" ];then
  export PATH=$OPENSSL_PATH/bin:$PATH
  export LD_LIBRARY_PATH=$OPENSSL_PATH/lib:$LD_LIBRARY_PATH
  export CPATH=$OPENSSL_PATH/include:$LD_LIBRARY_PATH
fi

今感じの設定を .bashrcに書いてましたが、 この中で、PATHに関しては敢えて必要ないので、 コメントアウトするなり消すなりしておきます。

.bashrc
1
2
3
4
5
6
7
# Openssl
OPENSSL_PATH=/usr/local/opt/openssl
if [ -d "$OPENSSL_PATH" ];then
#export PATH=$OPENSSL_PATH/bin:$PATH
  export LD_LIBRARY_PATH=$OPENSSL_PATH/lib:$LD_LIBRARY_PATH
  export CPATH=$OPENSSL_PATH/include:$LD_LIBRARY_PATH
fi

これで、 /usr/local/opt/openssl/bin/openssl ではなく /usr/bin/openssl を使う様になるので上の様な注意は出なくなります。

Sponsored Links
Sponsored Links

« FirefoxのVimperatorで'SyntaxError: expected expression, got keyword 'let''なエラー OS X 10.11 El CapitanのSystem Integrity Protection(SIP) (rootless)についてちょっと詳しく »

}