web-dev-qa-db-ja.com

SSLでCurlリクエストが失敗しますか?

私はこのコードを持っています

    if(ereg("^(https)",$url))
        curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,false);
    // execute, and log the result to curl_put.log
    $result = curl_exec($curl);


    $error = curl_error($curl);

指定されたエラーは

SSL read: error:00000000:lib(0):func(0):reason(0), errno 104

原因に関するアイデア

19
Matt Elhotiby

SSLを使用する場合は、php.iniで openssl extension が有効になっていることを確認してください。

12
Sarfraz

サードパーティのライブラリで作業しているときに、同様の不可解なエラーが発生しました。 CURLOPT_SSL_VERIFY[PEER|Host]しかし違いはありませんでした。私のエラーメッセージは似ていました:

SSL read: error:00000000:lib(0):func(0):reason(0), errno 54

そこで私は http://curl.haxx.se/libcurl/c/libcurl-errors.html にアクセスし、エラーコード54を探しました。

CURLE_SSL_ENGINE_SETFAILED (54) Failed setting the selected SSL crypto engine as default!

これは間違っていました-アプリケーションの他の部分でcurlを使用して他のHTTPS要求を作成していました。だから私は掘り続けて、この質問を見つけました R&RCurl:libcurlのエラー54

表示される出力はlibcurlのソースコードのlib/ssluse.cからのものであり、そこに記載されている「errno」はlibcurlエラーコードではなく、その時点での実際のerrno変数です。

ですから、 curl_error() の出力が誤解を招かないようにしてください。代わりに、 curl_errno() を使用して、correctエラーコードを取得します。この場合、実際には56、CURLE_RECV_ERRORです。ホスト名が間違っていました...

30
Nick Caballero

私も同じ問題を抱えています。ターゲットシステムのsslの構成が不適切であることが判明しました。

Php curlモジュール、GuzzleHttpバージョン、opensslバージョンを確認した後、ブラウザーでリンクを呼び出して動作しました。しかし、curl --tlsv1 -kv https://www.example.comコンソールにはまだエラーがありました。

そこで、SSL構成を https://www.ssllabs.com/ssltest/ で確認しました。Bで評価されていました。 。最後に、ターゲットシステムの構成を https://cipherli.st/ の提案に変更し、Webサーバーを再起動すると、すべてが機能しました。 ssllabsの新しい評価は現在A +です。

私のnginx設定(Ubuntu 14.04、nginx 1.4.6-1ubuntu3.5):

ssl     on;
ssl_certificate /etc/ssl/certs/1_www.example.com_bundle.crt;
ssl_certificate_key     /etc/ssl/private/www.example.com.key;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ecdh_curve secp384r1; # Requires nginx >= 1.1.0
ssl_session_cache shared:SSL:10m;
#ssl_session_tickets off; # Requires nginx >= 1.5.9
ssl_stapling on; # Requires nginx >= 1.3.7
ssl_stapling_verify off; # Requires nginx => 1.3.7
ssl_dhparam /etc/ssl/private/dhparams.pem;
ssl_trusted_certificate /etc/ssl/startssl.ca.pem;
resolver 8.8.8.8 valid=300s;
resolver_timeout 5s;
add_header Strict-Transport-Security "max-age=63072000; www.example.com; preload";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
1
Markus D.

関数curl_errorで同じエラーが出力されましたが、これは必ずしもSSLに関連しているわけではありません。関数curl_errnoを使用して正確なエラー番号を出力する方が適切であり、そこからより適切に診断できます。私の場合、52エラーコードが返され、そこからデバッグできました。実際、他のサーバーはデータを送信していませんでした。

0
eloone

CURLOPT_SSL_VERIFYPEERではなくCURLOPT_SSL_VERIFYHOSTを使用するつもりだと思います

0
Eli

これを追加:

curl_setopt($ curl、CURLOPT_SSL_VERIFYHOST、0);

私は同じエラーがあり、私のためにうまく働いた。

0
jacktrade