PHP cURL не работает с HTTPS - PullRequest
       21

PHP cURL не работает с HTTPS

19 голосов
/ 19 марта 2012

У меня были проблемы на моем сервере разработки, где cURL, хотя и прекрасно работает с любым HTTP, не работает должным образом ни с чем HTTPS - даже с одним и тем же ресурсом с разными протоколами (для тестирования я запрашивал google.com).используя http и https).

Возвратилась ошибка cURL: 35. «Где-то в рукопожатии SSL / TLS возникла проблема».

Я прочесал сеть и SO для решений, ивсе они должны были либо установить для CURLOPT_SSL_VERIFYPEER значение false, что ничего не меняет, либо для загрузки файла сертификата и установить для CURLOPT_CAINFO его путь, который также ничего не меняет.

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

Я также пытался явноустановив CURLOP_PORT на 443. Для полноты моего вопроса, я установил другие опции: CURLOPT_VERBOSE = true, CURLOPT_RETURNTRANSFER = true и CURLOPT_SSL_VERIFYHOST = 2 (я пробовал каждую комбинацию 1 и 2 с VERIFYPEER как true, так и false).Я также убедился в phpinfo (), что у меня есть OpenSSL и он включен.

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

Ответы [ 3 ]

22 голосов
/ 01 июля 2013

У Curl нет встроенных корневых сертификатов (как в большинстве современных браузеров).Вам нужно явно указать его на файл cacert.pem:

  curl_setopt($ch, CURLOPT_CAINFO, '/path/to/cert/file/cacert.pem');

Без этого curl не может проверить сертификат, отправленный обратно через ssl.Этот же файл корневого сертификата можно использовать каждый раз, когда вы используете SSL в curl.

Файл cacert.pem можно получить здесь: http://curl.haxx.se/docs/caextract.html

11 голосов
/ 21 марта 2012

Как насчет этого. Он выбирает то, что может быть домашней страницей HTTPS Google. ( Поскольку я отключил проверку сертификата, у меня нет возможности узнать, что это настоящая домашняя страница Google. ) Это должно помочь вам.

<?PHP

// connect via SSL, but don't check cert
$handle=curl_init('https://www.google.com');
curl_setopt($handle, CURLOPT_VERBOSE, true);
curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, false);
$content = curl_exec($handle);

echo $content; // show target page
?>
5 голосов
/ 05 июня 2017

Найдите, содержит ли ваша ОС каталог сертификатов.Если это так, то необходимые сертификаты CA часто уже включены.Например, в Ubuntu это обычно /etc/ssl/certs.Если этот каталог существует, задайте параметр пути CA:

curl_setopt($ch, CURLOPT_CAPATH, '/etc/ssl/certs');

В качестве альтернативы вы можете ссылаться на один файл сертификата CA.Включите файл cacert.pem в свой проект или установите его на своем сервере.Загрузите из надежного источника, например, cacert.org.Для одного файла не устанавливайте CAPATH, а вместо этого устанавливайте только CAINFO:

curl_setopt($ch, CURLOPT_CAINFO, '/path/to/cacert.pem');

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

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...