簡體   English   中英

Curl 請求在 SSL 上失敗了嗎?

[英]Curl request is failing on the SSL?

我有這個代碼

    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

關於原因的任何想法

我在使用第三方庫時遇到了類似的神秘錯誤。 我嘗試了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: Error 54 in libcurl ,它有這個寶石:

您看到的輸出來自 libcurl 源代碼中的 lib/ssluse.c,並且提到的“errno”不是 libcurl 錯誤代碼,而是當時實際的 errno 變量。

所以,不要讓curl_error()的輸出誤導你。 相反,使用curl_errno()獲取正確的錯誤代碼,在本例中實際上是 56,CURLE_RECV_ERROR。 有錯誤的主機名...

使用 SSL,請確保您已從 php.ini 啟用openssl 擴展

我遇到了同樣的問題。 事實證明,目標系統上的 ssl 配置錯誤。

在檢查了 php curl 模塊、GuzzleHttp 版本、openssl 版本后,我在瀏覽器中調用了該鏈接並且它工作正常。 但是使用curl --tlsv1 -kv https://www.example.com在控制台上仍然出現錯誤。

所以我檢查了https://www.ssllabs.com/ssltest/ 上的 ssl 配置,它被評為 B。那里有一些我以前從未見過的在線證書狀態協議 (OCSP) 錯誤。 最后,我將目標系統上的配置更改為https://cipherli.st/上的建議重新啟動了網絡服務器,一切正常。 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;

函數curl_error打印了相同的錯誤,但這不一定與 SSL 相關。 最好使用函數curl_errno打印精確的錯誤編號,您可以從那里更好地診斷。 就我而言,它返回了 52 錯誤代碼,我可以從那里進行調試,實際上另一台服務器沒有發送任何數據。

我認為您的意思是使用 CURLOPT_SSL_VERIFYHOST,而不是 CURLOPT_SSL_VERIFYPEER

這意味着目標服務器需要 SSL 通信。

您應該從運行 CURL 請求的發送服務器生成 SSL 證書

Let's Encrypt 是第一個免費且開放的 CA

一切都在這里描述sslforfree.com

在此處輸入圖片說明

我解決了這個 curl 錯誤:“SSL read: error:00000000:lib(0):func(0):reason(0), errno 104”,方法是從我的 url 查詢參數值(逗號分隔值)中刪除額外的空間。

例如:

https://example.com?a=123,456,SPACE_ADDED_BY_MISTAKE789

https://例子.com?a=123,456,789

添加這個:

curl_setopt( $curl, CURLOPT_SSL_VERIFYHOST, 0);

我有同樣的錯誤,對我來說效果很好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM