Php
PHP curl_exec 使用 HTTPS 失敗
我有一個失敗的 wordpress 網站。我跟踪了這個問題,發現這是由於
curl_exec()
HTTPS 站點失敗造成的。我在帶有 lighttpd 的 Alpine Linux v3.8 容器中執行 php 5.6。
日誌(error.log)沒有提供太多資訊:
(http-header-glue.c.1250) read(): Connection reset by peer 8 9
(gw_backend.c.2149) response not received, request sent: 1017 on socket: unix:/var/run/lighttpd/php.socket-0 for /curl_test.php?, closing connection
這些是已安裝的相關軟體包:
php5-common-5.6.40-r0 php5-cgi-5.6.40-r0 php5-gd-5.6.40-r0 php5-iconv-5.6.40-r0 php5-json-5.6.40-r0 php5-mysqli-5.6.40-r0 php5-zip-5.6.40-r0 php5-xml-5.6.40-r0 php5-dom-5.6.40-r0 php5-intl-5.6.40-r0 php5-ctype-5.6.40-r0 php5-mysql-5.6.40-r0 php5-openssl-5.6.40-r0 php5-curl-5.6.40-r0 curl-7.61.1-r2 libcurl-7.64.1-r1 libssl1.1-1.1.1b-r1 ssl_client-1.30.1-r1 libressl2.7-libcrypto-2.7.5-r0 libressl2.7-libssl-2.7.5-r0 libssl1.0-1.0.2r-r0 lighttpd-1.4.53-r1 lighttpd-openrc-1.4.53-r1 openssl-1.0.2r-r0 ca-certificates-cacert-20190108-r0 ca-certificates-20190108-r0
我試圖在螢幕上顯示錯誤(使用error_reporting等),但它似乎在能夠得到錯誤之前就崩潰了。
我發現了這個類似的問題,但我相信它不是關於程式碼,而是更多關於我的安裝中缺少的一些庫或設置。
我用於測試的程式碼是:
error_reporting(E_ALL); ini_set('display_errors', 1); $curl = curl_init( 'https://example.com' ); curl_setopt($curl, CURLOPT_CAINFO, '/etc/lighttpd/cacert.pem'); curl_setopt($curl, CURLOPT_CAPATH, '/etc/ssl/certs'); curl_setopt( $curl, CURLOPT_POST, true ); curl_setopt( $curl, CURLOPT_POSTFIELDS, array( 'field1' => 'some data', 'field2' => 'some more data' ) ); curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true ); $response = curl_exec( $curl ); curl_close( $curl );
注意:我從這裡下載了 cacert.pem ,並且
/etc/ssl/certs/
不是空的。顯示的錯誤是:“500 內部伺服器錯誤”。
甚至無法禁用 SSL 檢查:
curl_setopt($curl, CURLOPT_VERBOSE, true); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
如果我將其改為“http”而不是“https”,則一切正常。
我錯過了什麼?
更新 (1)
在這個問題之後,我執行了:
$w = stream_get_wrappers(); echo 'openssl: ', extension_loaded ('openssl') ? 'yes':'no', "\n"; echo 'http wrapper: ', in_array('http', $w) ? 'yes':'no', "\n"; echo 'https wrapper: ', in_array('https', $w) ? 'yes':'no', "\n"; echo 'wrappers: ', var_export($w);
結果是:
openssl: yes http wrapper: yes https wrapper: yes wrappers: array ( 0 => 'compress.zlib', 1 => 'php', 2 => 'file', 3 => 'glob', 4 => 'data', 5 => 'http', 6 => 'ftp', 7 => 'https', 8 => 'ftps', 9 => 'zip', )
注:
allow_url_fopen
已開啟。更新 (2)
我將網站移到一個新容器中,它執行良好。一些圖書館或其他東西導致了這個問題。
我在另一個容器中遇到了這個問題,更新到 php7 解決了這個問題。