2018年5月26日土曜日

CentOS5でphpのcurlからTLS1.2対応をさせる話

PCIDSSの対応で各決済会社のTLS1.2縛りが始まりました。

乗り遅れてしまった!! やばい!間もなくじゃない?
的な話もチラホラ聞きます。

phpで作られているシステムであれば、curl等を用いて決済情報に確認を
しにいったりリクエストを投げたりしているところが多いのではないでしょうか。

CentOS6以降であれば普通にyumで対応出来ちゃうのですが、
CentOS5系ですとyumでは無理。
proxyで逃げるという策もあるのですが、サーバーも立てられない環境だと、
なかなか安易に逃げれない。
という訳で、今回はphp-curlを更新して対応させちゃう話です。

/usr/localにはソースインストールしているような形跡が無い前提で、
php-5.3.19の環境を元に書いていますので、
その辺は自身の環境と読み変えて下さい。


全て最新を入れたいところなのですが、
全て最新だとなかなかいろいろと問題が出るので、
TLS1.2に対応出来ているという形で収めます。

opensslをダウンロードします。

wget --no-check-certificate https://www.openssl.org/source/old/1.0.1/openssl-1.0.1u.tar.gz
tar xzvf openssl-1.0.1u.tar.gz
cd openssl-1.0.1u

既存環境を汚したくないのでprefixを指定してconfigureします。

./config --prefix=/usr/local/openssl shared
make
make install

完了です。

次にcurlをインストールするのですが、opensslのlibを読み込めるように、
ldconfigでpathを読めるように以下を追記しておきます。
vi /etc/ld.so.conf
---------
/usr/local/openssl/lib
---------
ldconfig

curlですがs3等で画像の存在確認をして表示をさせるようなシステムだと、
最新のcurlでは--outputオプションをつけないとbinaryは表示出来ない為、
エラーになるケースが見受けられました。

以下は新しいcurlで実施していますが、エラーが出るようでしたら
curlを7.19くらいに落とすと上手くいきます。
ただ7.19をダウンロードするにも公式からTLSではじかれるので、
7.58.0をインストールしてから
curl -k curlのURL -o ファイル名
でもいいと思います。
ca情報が古い場合はpemファイルを上記と同じようにcurl -k でゲットして配置しなおします。
詳しくはこちら。
うまい棒ブログ(id:hogemさん)
サーバのSSL CA(認証局)証明書が古くてcurl がエラーになる件
http://hogem.hatenablog.com/entry/20120705/1340284071


さて、続きやります。今回は7.58.0をゲットして入れます。
今回も環境汚染しないようにcurlをprefix指定して別にインストールします。
新しいsslを読み込んで作りたいので新しくインストールしたopensslディレクトリを指定します。

wget --no-check-certificate https://execve.net/mirror/curl/curl-7.58.0.tar.gz
tar xzvf curl-7.58.0.tar.gz
cd curl-7.58.0
./configure --prefix=/usr/local/curl --with-ssl=/usr/local/openssl
make
make install

以下でバージョン確認するとopenssl-1.0.1uを参照しているのがわかると思います。
/usr/local/curl/bin/curl --version

新しくインストールしたcurlを元にphp-curlを作り直します。
今回の環境はphp-5.3.19がyumでインストールしてあったので、同じバージョンをダウンロードします。
切り戻せるように元からあるモジュールはバックアップしておきましょう。

mv /usr/lib64/php/modules/curl.so /usr/lib64/php/modules/curl.so.old
※32bit環境であればlib64をlibにして下さい。


wget http://museum.php.net/php5/php-5.3.19.tar.gz
tar xzf php-5.3.19.tar.gz
cd php-5.3.19/ext/curl/
phpize

新しくインストールしたcurlをディレクトリとして指定します。
./configure --with-curl=/usr/local/curl
make
make install

これで完了です。
php -i で確認するとcurlの参照opensslが1.0.1の新しいものに
なっていると思います。

以下のようなテストスクリプトでphpの実行ファイルを作成し、
実行した際にページの情報が表示されればokです。

-----------------------------------
<?php
$url = "対象サイトのURL";
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$html = curl_exec($ch);
var_dump($html);
curl_close($ch);
-----------------------------------

意図しない表示崩れ等を起こすと困るので、
apacheを再起動(gracefulやreloadでもok)して表示を確認しましょう。

今回はcurlでしたが他のphpモジュールで対応したい場合でも、
そのモジュールが参照するパッケージを新しくソースインストールして、
新しい方を参照する形で作り直せば通ると思います。

同じようにCentOS5のgitのsshやcurlでハマッてる人をよく見かけますが、
上記と同じようにopensslを元にsshやcurlを作れば大丈夫です。

ここまで書いといてあれですけど、
既に陳腐化しているシステムを無理くりやっているだけなので、
本来であればCentOS7に移行するのが筋です。

あくまでワークアラウンドでお考え下さい。

※ここに書いてある内容は一般的な対応方法では無いので
 くれぐれも実施後は確認を怠らず注意の上、自己責任でお願いします。


それでは、よいクラウド構築を。