CURL требует CURLOPT_SSL_VERIFYPEER = FALSE
Я использовал cURL на моем локальном хосте в течение самого долгого времени, и внезапно я заметил, что он больше не работает, если я не установил опцию, CURLOPT_SSL_VERIFYPEER
= FALSE
.
Я понятия не имею, как это изменилось, но я использую NGINX и PHP, и я могу проверить, что это не является конкретной проблемой для конкретного запрашиваемого хоста. Я получаю пустые ответы от https://site1.com
и https://different-site.com
.
У кого-нибудь есть мысли?
Ответы
Ответ 1
Благодаря предложениям Дэйва Чена, я понял, что, должно быть, неправильно разместил свой сертификат. Проблема решается с помощью этого сертификата, который предоставляется создателем cURL (извлечено из Mozilla): https://curl.haxx.se/ca/cacert.pem
Итак, после загрузки этого файла cacert.pem в ваш проект, в PHP вы можете сделать это:
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, TRUE);
curl_setopt($ch, CURLOPT_CAINFO, "/path/to/cacert.pem");
Кроме того, это может быть установлено глобально, добавив следующее в ваш php.ini
curl.cainfo=/path/to/cacert.pem
Ответ 2
Если вы используете WampServer, обратите внимание на это:
Вы должны поместить абсолютный путь в CURLOPT_CAINFO, например:
curl_setopt ($ch, CURLOPT_CAINFO, 'C:\wamp\www\your-project\cacert.pem')
Не используйте относительный путь: curl_setopt ($ ch, CURLOPT_CAINFO, 'cacert.pem') , потому что он не работает.
Ответ 3
Вы можете сделать это:
curl_setopt ($ ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt ($ ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt ($ ch, CURLOPT_CAINFO, getcwd(). "/path/cert.pem" );
В другой вариант, включенный Ive, CURLOPT_SSL_VERIFYHOST может быть установлен в следующие целочисленные значения:
0: Не проверяйте атрибут общего имени (CN)
1: Убедитесь, что атрибут общего имени по крайней мере существует.
2: Убедитесь, что общее имя существует и что оно соответствует имени узла сервера.
Если у вас установлено значение CURLOPT_SSL_VERIFYPEER равным false, то с точки зрения безопасности на самом деле не имеет значения, к чему вы установили CURLOPT_SSL_VERIFYHOST, поскольку без проверки сертификатов однорангового сервера сервер может использовать любой сертификат, включая самоподписанный, который был гарантирован иметь CN, который соответствует имени узла сервера. Таким образом, этот параметр действительно имеет значение только в том случае, если вы подтвердили верификацию сертификата.