Tech

CentOS5でGitの「Unknown SSL protocol error in connection to …」エラーに対応する

CentOS5.8でOpenSSL1.0.2、Curl7.53.1、git2.20.1とかをソースからビルドした話です。
あんまりサポート期限の切れたOSは使わずに、新しいの使いましょうね・・。

ということで、どうしても古いサーバ上で、元々動いていたgitを使えるようにしたいという要望が僕にもあったのでやむなく対応しました。

最近どこのサーバもTLS1.2でしかgitを使えなくなったこともあり、

export GIT_CURL_VERBOSE=1  
export GIT_TRACE_PACKET=2

を環境変数に追加したあとにgit cloneすると、

Unknown SSL protocol error in connection to xxx.xxx.com:443

とか言われたつらい経験があると思います。
wgetした際に、

SSL による接続が確立できません

とか出る場合もだいたいopensslのバージョンが古くてtls1.2に対応してない場合が多いと思います。

yumでアップデートしようにも、もうサポート切れてるのでOpenSSLは0.9.8までだしgitも1.なんぼかまでしか上がらないしどうしよう・・。

というのに対応したときのログです。つまり、yum等のパッケージ管理ソフトは使わずにCentOS5.8にgitの最新版をインストールしました。
もしかしたらサーバの他の機能に影響あるかもしれませんが、そこには責任取りませんのでぶっつけ本番でやらないようにしてくださいね。

前提条件など

  • CentOS5.8 64bit
  • それぞれのインストールフォルダは/usr/local/bin
  • gccとかwgetとかはインストールしてる前提で

/usr/local/binとかは適宜読み替えてください。

目指すところ

CentOS5のマシンでgit cloneができるようにする
というところまでです。

CentOS5.8 64bitに

  • OpenSSL 1.0.2q
  • Curl 7.53.1
  • Git 2.20.1

をインストールします。

1.OpenSSL 1.0.2qをソースからビルド

OpenSSLビルド、インストール

どこでもいいですが、ソースを置いておきたい場所でcdしてください。

cd ~/

ソースを取ってくる。openssl入ってない人向けか、httpでwgetさせてくれるなんて優しい。

wget http://www.openssl.org/source/openssl-1.0.2q.tar.gz --no-check-certificate  
tar -xvf openssl-1.0.2q.tar.gz  
cd openssl-1.0.2q  
./config shared zlib enable-ssl2 enable-ssl3 --prefix=/usr/local/ --openssldir=/usr/local/  
make depend  
make  
make install

ssl2、ssl3は念の為・・。

環境変数を追加

.bash_profileにPKG_CONFIG_PATHを追加。pkgconfigのpathを通す。

vi ~/.bash_profile

export PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig

確認

openssl version

→これでバージョン1.0.2qが出たら成功。出なければ、一回ログオフしたらいいかも。

2.Curl 7.53.1をソースからビルド

Curlビルド、インストール

wget https://curl.haxx.se/download/curl-7.53.1.tar.gz

wgetの参照してるライブラリが古いOpenSSLになってて、

OpenSSL: error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version
SSL による接続が確立できません。

とかなんとか言われるかもしれないので、scpかなんかで持ってきてください。

tar -xvf curl-7.53.1.tar.gz  
cd curl-7.53.1  
./configure --enable-libcurl-option --prefix=/usr/local/ --with-ssl=/usr/local/  
make  
make install

確認

curl --version

→古いバージョン出てたら、一回ログオフしてください。
たぶん下のエラーが出ると思うので、

curl: error while loading shared libraries: libssl.so.1.0.0: cannot open shared object file: No such file or directory

find /usr -name "libssl.so.1.0.0"

で出てきたディレクトリをld.so.confに追加。

echo "/usr/local/lib64/" > /etc/ld.so.conf  
ldconfig

curlのバージョンを確認

curl --version

curl 7.53.1 (x86_64-pc-linux-gnu) libcurl/7.53.1 OpenSSL/1.0.2q
Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp
Features: Largefile NTLM NTLM_WB SSL TLS-SRP UnixSockets HTTPS-proxy

curl 7.53.1、OpenSSL/1.0.2qになってればOK。

3.Gitをソースからビルド、インストール

Gitビルド、インストール

一応、yumで入れた古いgitがあれば削除しておく。

yum remove git

2019年1月12日現在最新のバージョン2.20.1にしてみました。

wget https://github.com/git/git/archive/v2.20.1.tar.gz

wgetはできないかもね・・。

tar -xvf git-2.20.1.tar.gz  
cd git-2.20.1  
./configure --prefix=/usr/local --with-curl --with-openssl  
make all

→zlib-develとかgettextとかがinstallされてないと、

警告: zlib.h: そのようなファイルやディレクトリはありません

とか、

tclsh failed; using unoptimized loading
MSGFMT po/bg.msg make[1]: *** [po/bg.msg] エラー 127

って言われると思うので

サポート終了のCentOS5で yum update する方法

↑このあたりの対応してから、yumで必要なライブラリを追加してください。

make install

確認

git config --global --add http.sslVersion tlsv1.2  
git clone https://xxx.com/origin_web.git

たぶんいけるはず。無理だったら出てきたエラーメッセージに従って対応してください。

4.phpからgitを実行する場合

gitをphpから実行する場合、Apache EnvironmentのPATHに/usr/local/binが含まれてないと思うので、yumでinstallされたgitが呼ばれてしまう。

だいたいhttpd.confに

SetEnv PATH "${PATH}:/usr/local/bin"

を書く方法が出てくるんだけどなぜかこれだとpathに追加されなかったので、/etc/init.d/httpd のstartのところに以下を追加して対応しました。

export PATH=$PATH:/usr/local/bin

5.まとめ

けっこうハマったのでやったことを一連の流れにしてまとめました。
必要なパッケージが足りてないなどで、この通りにやってもうまくいかない場合もあると思いますのでその際は柔軟に対応してください。

この記事が誰かの役に立てばいいなと思います。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

x  Powerful Protection for WordPress, from Shield Security
このサイトは
Shield Security によって保護されています →