чтение страницы 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,
    );

Любые предложения были бы замечательными, Эндрю

 33
Author: Andrew, 2009-02-06

7 answers

Похоже, вы неправильно истолковываете ошибку. Мне кажется, что сайт, к которому вы подключаетесь, является самоподписанным или какой-то другой распространенной проблемой. Как и в обычном предупреждении браузера, проще всего обойти это, отключив проверки.

Вам нужно будет установить CURLOPT_SSL_VERIFYPEER и CURLOPT_SSL_VERIFYHOST в FALSE. Это должно отключить две основные проверки. Возможно, они оба не требуются, но это должно, по крайней мере, заставить вас двигаться.

Чтобы быть ясным, это отключает функцию, предназначенную для вашей защиты. Делайте это только в том случае, если вы проверили сертификат и сервер каким-либо другим способом.

Дополнительная информация на сайте PHP: curl_setopt()

 48
Author: Ryan Graham, 2013-09-18 19:45:02

Если вы хотите использовать одноранговую проверку SSL (отключить ее не всегда хорошая идея), вы можете использовать следующее решение в Windows глобально для всех приложений:

  1. Загрузите файл с корневыми сертификатами отсюда: http://curl.haxx.se/docs/caextract.html
  2. Добавить в php.ini:

curl.cainfo=C:/path/to/cacert.pem

Вот и все волшебство, теперь CURL может проверять сертификаты.

( насколько я знаю, в Linux такой проблемы нет, по крайней мере, в Ubuntu)

 21
Author: WayFarer, 2012-11-29 21:38:49

Даже после выполнения рекомендаций по 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");
 6
Author: pkanane, 2013-01-18 16:39:31

Это "проблема" с openssl и VeriSign.

У меня была аналогичная проблема, и в моем openssl отсутствовал промежуточный ssl-сертификат, используемый VeriSign для подписи сертификата сервера.

Https://knowledge.verisign.com/support/ssl-certificates-support/index?page=content&id=AR657

Мне пришлось импортировать эти промежуточные сертификаты с домашней страницы VeriSign или экспорта базы данных сертификатов Firefox в мой локальный список сертификатов ca, и после этого шага я был возможность использовать wget/curl для использования защищенного соединения без каких-либо ошибок.

 2
Author: Comradin, 2010-06-10 11:51:24

Если это машина разработчика - вы также можете добавить этот сертификат в свою систему. Что-то вроде этого - https://www.globalsign.com/support/intermediate/intermediate_windows.php Он предназначен для WinXP, но работает и в других версиях Windows.

 1
Author: Paul Paca-Vaca Seleznev, 2012-12-07 14:52:49

Вы не отправляете сертификат SSL. Похоже, что возникла проблема с сертификатом SSL, поскольку он установлен на хосте, с которым вы связываетесь. Используйте опцию -k или --небезопасно, чтобы пройти мимо жалобы.

Ах. Смотрите ответ Райана Грэма

 0
Author: PartialOrder, 2009-02-06 18:11:01

По-видимому, это ошибка openssl. Tomcat можно настроить для обхода этого в /etc/tomcat7/server.xml ограничивая список доступных шифров:

<Connector protocol="HTTP/1.1" SSLEnabled="true" ... ciphers="SSL_RSA_WITH_RC4_128_SHA"/>
 0
Author: Sreedhar GS, 2014-04-28 11:38:26