プライベートリポジトリ用に建てている GitLab には、CloudFlare で SSL を有効にして https でアクセスしていますが、Ubuntu 14.04 から git pull
しようとしたら、
gnutls_handshake() failed: Handshake failed
とのエラーで失敗してしまいました。git clone
も git push
も全部失敗します。CloudFlare を経由する前は問題なかったので、おそらく SSL のプロキシが失敗している理由でしょう。また、Mac の git からはアクセスできているし、エラーメッセージにも gnutls_handshake()
が失敗しているとあるので、Ubuntu の git が依存している SSL ライブラリに原因がありそうです。
OpenSSL を使う git のビルド
もはや当然のように Stack Overflow にはほぼ同じ質問があり、そして解決法についての回答もありました。「gnutls はプロキシ越しだと変な挙動をするから、openssl を使うようにビルドするといいよ」とのこと。そうなんだ… GnuTLS が微妙なんですかねぇ。
とりあえずその指示の通りに、openssl をリンクした git のバイナリパッケージをビルドします。
$ sudo apt-get install build-essential fakeroot dpkg-dev
$ mkdir ~/temp/git-openssl
$ cd ~/temp/git-openssl
$ sudo apt-get source git
$ sudo apt-get build-dep git
$ sudo apt-get install libcurl4-openssl-dev
$ sudo dpkg-source -x git_1.9.1-1.dsc
$ cd git-1.9.1
debian/control
ファイルを編集し、ファイル内の libcurl4-gnutls-dev
をすべて libcurl4-openssl-dev
に置換します (1箇所だけでした) 。
置換が済んだら、パッケージをビルドします。
sudo dpkg-buildpackage -rfakeroot -b
ビルドされた 64bit アーキテクチャ版の git をインストールします。
$ sudo dpkg -i ../git_1.9.1-1_amd64.deb
これで、無事に CloudFlare 経由の GitLab にアクセスできるようになりました。どうせなら最新バージョンの git のソースでやればよかった…