Ответ 1
С SSL убедитесь, что у вас расширение openssl включено из php.ini.
У меня есть этот код
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_setopt ($ curl, CURLOPT_SSL_VERIFYHOST, 0);
У меня была такая же ошибка, и я работал отлично.
У меня была такая же ошибка, напечатанная функцией 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