PHPのHTTPS通信、SSL暗号方式をTLS1.2に対応させてみた
TLS1.2に対応する
SSL v3.0の脆弱性からTLSへの対応が求められてきたが、ついにTLS1.2以外の通信は無効にするとの連絡がきた。
結論から言うと、TLS1.2に対応するためには、cUrlのバージョンが7.34.0以上かつOpenSSLのバージョンが1.0.1以上でなければならない。
環境
ウチのサーバー環境は次の通り。
エックスサーバー:X20プラン
PHP:5.6.30
cURL:7.47.1
SSL:OpenSSL/1.0.1e
エックスサーバーはPHPのバージョンを上げると、あわせてcURLやOpenSSLのバージョンが上がる仕組みだ。
下記のPHPプログラムをサーバーにアップロードして、ブラウザからアクセスすると、自分のサーバー環境が確認できる。
<?php phpinfo(); ?>
PHPプログラム
cURLを使ったPHPプログラムのサンプル(POST送信)。
<?php $data = 'test1=aaa&test2=bbb'; $ch = curl_init("https://tlstest.paypal.com"); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2); curl_setopt($ch, CURLOPT_SSL_CIPHER_LIST, 'TLSv1'); var_dump(curl_exec($ch)); curl_close($ch); ?>
HTTPS通信する先は、PaypalのTLS1.2対応テストサーバーを使ってみた。
あとCURLOPT_SSLVERSIONオプションに「CURL_SSLVERSION_TLSv1_2」と明示してみた。
このプログラムを自分のサーバーで走らせたとき、次の文字が表示されれば成功だ。
PayPal_Connection_OK
追記
エックスサーバーの仕様によっては、curlのバージョンが「7.29.0」、sslのバージョンが「NSS/3.28.4」であるかも知れない。
この場合は、SSLVERSION と SSL_CIPHER_LIST を明示的に指定してしまうとエラーになるので注意。
つまり正しくは、次のコードとなる。
<?php $data = 'test1=aaa&test2=bbb'; $ch = curl_init("https://tlstest.paypal.com"); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); var_dump(curl_exec($ch)); curl_close($ch); ?>