PHPでcurlライブラリ(NSSを使用)を使用して他のサーバーに接続しています。先週、poodleの脆弱性により宛先サーバーがSSLv3のサポートを停止するまではすべて問題ありませんでした方法)。今、TLSを使用して接続しようとしていますが、まだ「SSL接続エラー」が発生しています。
サンプルコードがあり、私は使用しています:
$ch = curl_init();
curl_setopt_array( $ch, array(
CURLOPT_URL => 'https://www.lumiart.cz',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSLVERSION => 1,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_VERBOSE => true
) );
$output = curl_exec( $ch );
echo $output;
print_r( curl_getinfo( $ch ) );
echo 'error:' . curl_error( $ch );
curl_close($ch);
私の理解では、CURLOPT_SSLVERSION
から1
は、TLS経由の接続を強制する必要があります。
注:CURLOPT_SSL_VERIFYPEER => false
はデバッグのためだけであり、この問題を見つけたらそこに置いておくつもりはありません。
これは出力です:
Array
(
[url] => https://www.lumiart.cz
[content_type] =>
[http_code] => 0
[header_size] => 0
[request_size] => 0
[filetime] => -1
[ssl_verify_result] => 0
[redirect_count] => 0
[total_time] => 0
[namelookup_time] => 2.3E-5
[connect_time] => 0.005777
[pretransfer_time] => 0
[size_upload] => 0
[size_download] => 0
[speed_download] => 0
[speed_upload] => 0
[download_content_length] => -1
[upload_content_length] => -1
[starttransfer_time] => 0
[redirect_time] => 0
[certinfo] => Array
(
)
[primary_ip] => 2400:cb00:2048:1::681c:86f
[redirect_url] =>
)
error:SSL connect error
これらはすべて共有ホスティングプロバイダーにあるため、php.iniの構成を変更したり、コンポーネントを更新したりすることはできません。私が持っているのはphpinfo()だけです。これらのコンポーネントバージョンでTLSサポートを確認しましたが、問題ないはずです。 phpinfoの抜粋を次に示します。
PHP Version 5.4.32
System Linux wl42-f262 2.6.32-431.5.1.el6.x86_64 #1 SMP Wed Feb 12 00:41:43 UTC 2014 x86_64
curl:
cURL support enabled
cURL Information 7.19.7
Age 3
Features
AsynchDNS No
Debug No
GSS-Negotiate Yes
IDN Yes
IPv6 Yes
Largefile Yes
NTLM Yes
SPNEGO No
SSL Yes
SSPI No
krb4 No
libz Yes
CharConv No
Protocols tftp, ftp, telnet, dict, ldap, ldaps, http, file, https, ftps, scp, sftp
Host x86_64-redhat-linux-gnu
SSL Version NSS/3.15.3
ZLib Version 1.2.3
libSSH Version libssh2/1.4.2
その問題は、TLSではなくSSLv3を使用していることだと思いますが、100%確信はありません。私が取得しているのは「SSL接続エラー」だけで、どのSSLバージョンが接続に使用されたかを知る方法がわかりません。
接続に使用されるSSLバージョンを確認する方法、方法はありますか?それとも何か不足していますか?
それは興味深い問題です。
このサイトで SSLLabs を照会すると、さまざまなECDHE-ECDSA- *暗号のみがサポートされ、他の暗号はサポートされていないことがわかります。しかし、 curlのバージョン履歴 には、ECC暗号とNSSライブラリ(使用する)のバグがあります。これはcurlバージョン7.36でのみ修正されます "nss:allow to use NSSがECC暗号を実装している場合、ECC暗号」 。
Curl 7.19.7を使用しているため、NSSライブラリと一緒に必要な暗号を使用するにはcurlが古すぎます。これは、curlライブラリをアップグレードする必要があることを意味します。
私はCurl 7.21.7とPHP 5.4.34、そしてこのseemedを使って私のためのトリックをしています:
curl_setopt($curl_request, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1);
詳細情報 こちら 。ただし、CURL_SSLVERSION_TLSv1が導入された時期については言及していません。
私にとっての答えは、文字列の代わりに整数値を使用することでした。つまり、変更:
curl_setopt($ch, CURLOPT_SSLVERSION_TLSv1_2);
に:
curl_setopt($ch, CURLOPT_SSLVERSION, 6);
またはtlsv1_1の場合:
curl_setopt($ch, CURLOPT_SSLVERSION, 5);
完全なリストは次のとおりです。
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-7.19.7-46.el6.x86_64
nss-3.21.0-0.3.el6_7.x86_64
重複した回答 SSLエラーはTLSに変更できません 提案:
CURLOPT_SSL_CIPHER_LIST => 'TLSv1'をPPHttpConfig.phpに追加してみてください。
(そして、ここで説明します pdate PHP SSLv3からTLSへのcURLリクエスト..? も)。
便利なコメントとして、これはopensslcurlライブラリに適用され、nssには適用されません。