FIVETEESIXONE

Ubuntu 14.04 から CloudFlare を経由した GitLab にアクセスできない


プライベートリポジトリ用に建てている GitLab には、CloudFlare で SSL を有効にして https でアクセスしていますが、Ubuntu 14.04 から git pull しようとしたら、

gnutls_handshake() failed: Handshake failed

とのエラーで失敗してしまいました。git clonegit 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 のソースでやればよかった…