У меня есть этот код
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
Любые идеи о причине
С помощью SSL убедитесь, что у вас есть расширение openssl , включенное из php.ini.
Я столкнулся с подобной загадочной ошибкой при работе с сторонней библиотекой. Я попробовал 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!
Это было неправильно, но я делал другие запросы HTTPS, используя curl в других частях приложения. Поэтому я продолжал рыть и нашел этот вопрос, R & RCurl: Ошибка 54 в libcurl , у которого был этот камень:
Результат, который вы видите, находится в lib / ssluse.c в исходном коде libcurl, а упоминаемое здесь «errno» – это не код ошибки libcurl, а фактическая переменная errno в то время.
Итак, не позволяйте вывода curl_error () вводить вас в заблуждение. Вместо этого используйте curl_errno (), чтобы получить правильный код ошибки, который в этом случае был фактически 56, CURLE_RECV_ERROR. Неправильное имя хоста …
У меня была такая же ошибка, напечатанная функцией curl_error
но это не обязательно связано с SSL. Лучше напечатать точное число ошибок с помощью функции curl_errno
и вы сможете лучше диагностировать ее там. В моем случае он вернул мне код ошибки 52, и я мог отлаживать оттуда, на самом деле другой сервер не отправлял никаких данных.
У меня была та же проблема. Оказалось, что ssl на целевой системе имеет плохую конфигурацию.
После проверки модуля curl php, версии GuzzleHttp, версии openssl я назвал ссылку в браузере, и она сработала. Но с curl --tlsv1 -kv https://www.example.com
на консоли все еще была ошибка.
Поэтому я проверил конфигурацию ssl на https://www.ssllabs.com/ssltest/. Он был оценен с помощью 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;
Я думаю, вы хотите использовать CURLOPT_SSL_VERIFYHOST, а не CURLOPT_SSL_VERIFYPEER
Добавь это:
curl_setopt ($ curl, CURLOPT_SSL_VERIFYHOST, 0);
У меня была такая же ошибка, и я работал отлично.