чтение страницы SSL с CURL (php)

Я пытаюсь загрузить содержимое защищенной (использует https) веб-страницы, используя библиотеки php и curl.

Однако чтение не удалось, и я получаю ошибку 60: «Проблема с сертификатом SSL, убедитесь, что сертификат CA в порядке».

также "Подробности: SSL3_GET_SERVER_CERTIFICATE: проверка сертификата не удалась"

Итак ... довольно понятные сообщения об ошибках.

Мой вопрос: как мне отправить сертификат 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,
    );

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


person Andrew    schedule 06.02.2009    source источник
comment
Считайте, что эта статья - то, что вам нужно.   -  person Sergey Galashyn    schedule 06.02.2009


Ответы (7)


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

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

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

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

person Ryan Graham    schedule 06.02.2009
comment
да, ... я читал эту статью раньше, ... но установка обоих этих значений на false не имела для меня особого смысла ... думаю, я действительно не знаю, что происходит. однако он работал отлично. тогда спасибо :) - person Andrew; 06.02.2009
comment
@MattS, конечно же! Я собираюсь отредактировать ответ, чтобы сделать это более очевидным. - person Ryan Graham; 18.09.2013
comment
Это ничего не решает. Это опасное поведение, @Ryan, и тебе действительно стоит прекратить учить этому людей. SSL существует не просто так. Отсутствие проверки сертификатов лишает смысла наличие SSL. Убедитесь, что вы понимаете, почему возникает эта ошибка. Не как заставить его уйти. - person Ruben; 17.02.2014
comment
@Ruben не стесняйтесь редактировать ответ, если вы считаете, что существующего отказа от ответственности жирным шрифтом недостаточно. - person Ryan Graham; 18.02.2014
comment
https://web.archive.org/web/20150223140338/http://docforge.com/wiki/PHP/Curl архив старой страницы. - person Passer by; 08.02.2017

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

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

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

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

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

person WayFarer    schedule 26.11.2012
comment
Это сработало! У меня была эта проблема на Centos 6 ... так что кажется, что не все дистрибутивы застрахованы :) - person Ben D; 18.12.2014

Даже после следующих советов по 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");
person pkanane    schedule 18.01.2013

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

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

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

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

person Comradin    schedule 10.06.2010

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

person Paul Paca-Vaca Seleznev    schedule 07.12.2012
comment
Ссылка выше мертва; перенаправляет на домашнюю страницу globalsign.com. - person William Price; 10.02.2015

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

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

person PartialOrder    schedule 06.02.2009

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

<Connector protocol="HTTP/1.1" SSLEnabled="true" ... ciphers="SSL_RSA_WITH_RC4_128_SHA"/>
person Sreedhar GS    schedule 28.04.2014