CentOS 6 の Git で SSL connect error にハマった (NSS error -12286)
CentOS 6 の Git で急に fetch や pull ができなくなってハマったので、その記録です。なお、サーバー側は GitLab です。
症状
以前はできていたはずのリポジトリで git fetch
が下記のようなエラーを出して、実行できなくなりました。
fatal: unable to access 'https://sample.com/hogehoge.git': SSL connect error
同じく、別ディレクトリで同一サーバーからの git clone
もできなくなっていました。ただ BitBucket のリポジトリは同症状なのに GitHub のリポジトリだけは成功してしまうという困った状態でした。
なお OpenSSL は yum で更新できる最新の状態でした。
試行錯誤
1. git の SSL 検証を OFF にしてみる
よくある対処法ですが、 SSL/TLS 系のエラーなのは間違いなさそうだったので、 SSL 検証を OFF にしてみましたが、効果はありませんでした。
git config --global http.sslVerify false
2. GitLab 側の認証を外す
GitLab のリポジトリ側の認証をゆるゆるにしてみましたが、エラー内容は変わらず、どうも認証以前にエラーを吐いている様子なので元に戻しました。
3. Git のバージョンアップ
Git をソースからコンパイルして最新 (2.11.0) に更新してみましたが、エラーメッセージが微妙に変化しただけで同様のエラーは継続しました。
4. curl を更新
調べてみると git が内部で使用している curl でエラーになっているようなので、 libcurl もソースからコンパイルして最新 (7.51.0) に更新しました。
が、 git が参照している curl は yum インストールされているものらしく効果なし。パスを設定し直しても、なぜかかたくなに旧バージョンしか使ってくれず、時間的制限のため、とりあえず断念しました。
5. verbose モードで git を実行
curl 関連であることがわかったので、 export GIT_CURL_VERBOSE=1
で詳細なログを吐くように設定しました。
この状態で git fetch
をしてみると下記のように表示されました。
Cloning into 'hogehoge'...
* Couldn't find host sample.com in the .netrc file; using defaults
* About to connect() to sample.com port 443 (#0)
* Trying xxx.xxx.xxx.xxx... * Connected to sample.com(xxx.xxx.xxx.xxx) port 443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
* NSS error -12286
* Expire cleared
* Closing connection #0
fatal: unable to access 'https://sample.com/hogehoge.git': SSL connect error
NSS error -12286
というエラーから curl が OpenSSL でなく NSS(Network Security Services) を使用していることがわかりました。
ソースから curl をコンパイルすると OpenSSL を使うようになるようですが、前項で断念しているため、とりあえず他の解決法を模索しました。
なお -12286 は SSL_ERROR_NO_CYPHER_OVERLAP を表すエラーです。
解決方法
このページで下記のコメントを発見しました。
Upgrading the nss package (i.e. yum update nss) or using curl -1 might also solve this. – DiegoG Dec 14 at 12:31
後者は git 内部のことなので、前者を試してみた。NSS のバージョンは 3.16.2.3 だったので、 yum で update したところ 3.21.3 に更新されました。
yum update nss
この状態で git fetch してみると…!問題なく実行できました!!
もちろん git clone も OK。あっけなく解決してしまいました…
まとめ
というわけで、CentOS 6 の Git でこの問題に当たったときは
export GIT_CURL_VERBOSE=1
git fetch
をしてみて、 NSS error が表示されるようなら
yum update nss
してみましょう。
そしてできるだけ CentOS 6 はもうやめて 7 に移行しましょう(泣)
ステージング環境はとても大事だと思い知らされた1件でした。 次回の記事でお会いしましょう。