web-dev-qa-db-ja.com

PHP Curl(NSSを使用))は、おそらくhttpsに接続するときにTLSではなくSSLv3を使用しています

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バージョンを確認する方法、方法はありますか?それとも何か不足していますか?

11
Lapak

それは興味深い問題です。

このサイトで SSLLabs を照会すると、さまざまなECDHE-ECDSA- *暗号のみがサポートされ、他の暗号はサポートされていないことがわかります。しかし、 curlのバージョン履歴 には、ECC暗号とNSSライブラリ(使用する)のバグがあります。これはcurlバージョン7.36でのみ修正されます "nss:allow to use NSSがECC暗号を実装している場合、ECC暗号」

Curl 7.19.7を使用しているため、NSSライブラリと一緒に必要な暗号を使用するにはcurlが古すぎます。これは、curlライブラリをアップグレードする必要があることを意味します。

20
Steffen Ullrich

私はCurl 7.21.7とPHP 5.4.34、そしてこのseemedを使って私のためのトリックをしています:

curl_setopt($curl_request, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1);

詳細情報 こちら 。ただし、CURL_SSLVERSION_TLSv1が導入された時期については言及していません。

12
Derrick Miller

私にとっての答えは、文字列の代わりに整数値を使用することでした。つまり、変更:

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
3
David Breise

重複した回答 SSLエラーはTLSに変更できません 提案:

CURLOPT_SSL_CIPHER_LIST => 'TLSv1'をPPHttpConfig.phpに追加してみてください。

(そして、ここで説明します pdate PHP SSLv3からTLSへのcURLリクエスト..? も)。

便利なコメントとして、これはopensslcurlライブラリに適用され、nssには適用されません。

2
philippe lhardy