[英]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
到
添加這個:
curl_setopt( $curl, CURLOPT_SSL_VERIFYHOST, 0);
我有同樣的錯誤,對我來說效果很好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.