うまいぼうぶろぐ

linuxとhttpdとperlのメモ

RedHat/CentOS のphp/curlでGMO決済にsslで蹴られる現象の対応

GMO側がPCI DSS対応でTLS 1.2のみでの接続となってる。で、CentOS6でcurlで接続すると、
rpmでinstallされているcurl/opensslはtls 1.2に対応しているにも関わらずSSL Connect Errorで弾かれる。
(正確にはcurl直叩きではなくてphpから呼び出すcurl)

curl-7.19.7
openssl-1.0.1e

http://php.net/manual/ja/function.curl-setopt.php

この辺見ていると、curlで接続するSSLのバージョンは
CURLOPT_SSLVERSIONで定義されて、デフォルトはCURL_SSLVERSION_DEFAULT

CURL_SSLVERSION_DEFAULT 0
CURL_SSLVERSION_TLSv1 1
CURL_SSLVERSION_SSLv2 2
CURL_SSLVERSION_SSLv3 3
CURL_SSLVERSION_TLSv1_0 4
CURL_SSLVERSION_TLSv1_1 5
CURL_SSLVERSION_TLSv1_2 6


CURL_SSLVERSION_DEFAULTが何なのかが調べてもわからなかったけど
挙動を見ている限り、tls 1.0 で接続しているぽい。
(RedHat6からopensslからNSSに変更になったのが関係してそう)

解決策

phpcurl側でtls v1.2を指定する。
CURL_SSLVERSION_TLSv1かCURL_SSLVERSION_TLSv1_2。
(TLSv1は1.0ではなくてTLS1全部)

php

$ch = curl_init();
curl_setopt($ch, CURLOPT_SSLVERSION, 1);

curl --tlsv1.2 を指定する。

解決策2

nssじゃなくてopensslだといけるらしいので、curlphpをソースで頑張っていれる。
アプリケーション側でどうしてもオプション指定できない場合はこっちで?