чтение страницы SSL с помощью CURL (php)
Я пытаюсь загрузить содержимое защищенной (использует https) веб-страницы с использованием библиотек php и curl.
Однако чтение не удалось, и я получаю ошибку 60: "Проблема с сертификатом SSL, убедитесь, что сертификат CA в порядке".
Также "Подробности: SSL3_GET_SERVER_CERTIFICATE: проверка сертификата не удалась"
Итак... довольно понятная ошибка msg.
Мой вопрос: как мне отправить SSL-сертификат (правильный?) и получить эту страницу, чтобы проверить его и позволить мне в?
Кроме того, вот мой массив опций на случай, если вам интересно:
$options = array(
CURLOPT_RETURNTRANSFER => true, // return web page
CURLOPT_HEADER => false, // don't return headers
CURLOPT_FOLLOWLOCATION => true, // follow redirects
CURLOPT_ENCODING => "", // handle all encodings
CURLOPT_USERAGENT => "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:x.x.x) Gecko/20041107 Firefox/x.x", // who am i
CURLOPT_AUTOREFERER => true, // set referer on redirect
CURLOPT_CONNECTTIMEOUT => 120, // timeout on connect
CURLOPT_TIMEOUT => 120, // timeout on response
CURLOPT_MAXREDIRS => 10, // stop after 10 redirects
CURLOPT_SSL_VERIFYHOST => 1,
);
Любые предложения были бы замечательными, Эндрю
7 answers
Похоже, вы неправильно истолковываете ошибку. Мне кажется, что сайт, к которому вы подключаетесь, является самоподписанным или какой-то другой распространенной проблемой. Как и в обычном предупреждении браузера, проще всего обойти это, отключив проверки.
Вам нужно будет установить CURLOPT_SSL_VERIFYPEER
и CURLOPT_SSL_VERIFYHOST
в FALSE
. Это должно отключить две основные проверки. Возможно, они оба не требуются, но это должно, по крайней мере, заставить вас двигаться.
Чтобы быть ясным, это отключает функцию, предназначенную для вашей защиты. Делайте это только в том случае, если вы проверили сертификат и сервер каким-либо другим способом.
Дополнительная информация на сайте PHP: curl_setopt()
Если вы хотите использовать одноранговую проверку SSL (отключить ее не всегда хорошая идея), вы можете использовать следующее решение в Windows глобально для всех приложений:
- Загрузите файл с корневыми сертификатами отсюда: http://curl.haxx.se/docs/caextract.html
- Добавить в php.ini:
curl.cainfo=C:/path/to/cacert.pem
Вот и все волшебство, теперь CURL может проверять сертификаты.
( насколько я знаю, в Linux такой проблемы нет, по крайней мере, в Ubuntu)
Даже после выполнения рекомендаций по SO.. У вас все еще могут возникнуть проблемы с такой ошибкой, как:
error:14077438:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert internal error
Проблема заключается в версии SSL. Используйте следующее для версии 3
curl_setopt($ch, CURLOPT_SSLVERSION,3)
Я предполагаю, что вы также включили проверку однорангового узла и хоста и указываете на фактический файл сертификата. Например.
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_CAINFO, getcwd() . "/cacert.pem");
Это "проблема" с openssl и VeriSign.
У меня была аналогичная проблема, и в моем openssl отсутствовал промежуточный ssl-сертификат, используемый VeriSign для подписи сертификата сервера.
Https://knowledge.verisign.com/support/ssl-certificates-support/index?page=content&id=AR657
Мне пришлось импортировать эти промежуточные сертификаты с домашней страницы VeriSign или экспорта базы данных сертификатов Firefox в мой локальный список сертификатов ca, и после этого шага я был возможность использовать wget/curl для использования защищенного соединения без каких-либо ошибок.
Если это машина разработчика - вы также можете добавить этот сертификат в свою систему. Что-то вроде этого - https://www.globalsign.com/support/intermediate/intermediate_windows.php Он предназначен для WinXP, но работает и в других версиях Windows.
Вы не отправляете сертификат SSL. Похоже, что возникла проблема с сертификатом SSL, поскольку он установлен на хосте, с которым вы связываетесь. Используйте опцию -k или --небезопасно, чтобы пройти мимо жалобы.
Ах. Смотрите ответ Райана Грэма
По-видимому, это ошибка openssl. Tomcat можно настроить для обхода этого в /etc/tomcat7/server.xml ограничивая список доступных шифров:
<Connector protocol="HTTP/1.1" SSLEnabled="true" ... ciphers="SSL_RSA_WITH_RC4_128_SHA"/>