ノラプログラマーの技術メモ

ネットで調べても出てこなかった情報を載せていきたい技術系ブログ。

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();
?>

f:id:kawai_norimitsu:20170901201431p:plain

f:id:kawai_norimitsu:20170901201440p:plain

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」であるかも知れない。

f:id:kawai_norimitsu:20180303152835p:plain

この場合は、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);
?>

PHPHTTPS通信、SSL暗号方式をTLS1.2に対応させてみた。完。