PHP CURL CURLOPT_SSL_VERIFYPEER игнорируется

117

По какой-то причине я не могу использовать CURL с HTTPS. Все работало нормально, пока я не обновил библиотеки curl. Теперь я получаю такой ответ при попытке выполнить запросы CURL: Проблема с сертификатом SSL CA (путь? Права доступа?)

Следуя опубликованным здесь предложениям по связанным вопросам, я попытался сделать следующее:

  • Отключить проверку для хоста и однорангового узла

    curl_setopt($cHandler, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($cHandler, CURLOPT_SSL_VERIFYPEER, true);
  • Включите CURLOPT_SSL_VERIFYPEERи укажите на cacert.pem, загруженный с http://curl.haxx.se/docs/caextract.html

    curl_setopt($cHandler, CURLOPT_SSL_VERIFYPEER, true);  
    curl_setopt($cHandler, CURLOPT_CAINFO, getcwd() . "/positiveSSL.ca-bundle");
  • Я также попытался сделать то же самое с положительнымSSL.ca-bundle, который был предоставлен как сертификат CA пакета для сервера, к которому я пытаюсь подключиться.

  • Отредактируйте настройки php ini с помощью curl.cainfo=cacert.pem(файл в том же каталоге и доступен через apache)

  • Переименовать /etc/pki/nssdbв/etc/pki/nssdb.old

К сожалению, ни один из перечисленных выше способов не может решить мою проблему, и я постоянно получаю сообщение «Проблема с сертификатом SSL CA» (путь? Права доступа?).

И эта проверка мне вообще не нужна (я знаю о проблемах безопасности).

Есть ли у кого-нибудь другие предложения?

ОБНОВИТЬ

После обновления до последних библиотек и перезапуска всего окна, а не только apache, который я делал, похоже, теперь снова работает !!!

Greg
источник
1
Вы обновили библиотеку Curl, скомпилированную для другого стека SSL (возможно, GnuTLS против OpenSSL)?
Бруно
Я бы так не подумал. Это Fedora 16, и на самом деле это был случай обновления yum. Больше всего раздражает то, что мне не нужна / не нужна вся эта проверка, и я не могу просто отключить ее.
Грег
Если вы хотите использовать HTTPS для обеспечения безопасности, вам всегда нужно иметь этот процесс проверки.
Бруно
Я знаю об этом, однако мой вариант использования здесь делает все это немного избыточным. Кроме того, я обновил curl до последней доступной версии, а php - до версии 5.4. Теперь сообщение об ошибке исчезло, но я также не получаю никакого покрытия от curl :)
Грег
Ха, теперь я где-то нашел функцию curl_errno, которая сообщает о статусе 77, который, согласно руководству, является CURLE_SSL_CACERT_BADFILE.
Грег

Ответы:

240

Согласно документации: для проверки сертификата узла или узла вам необходимо указать альтернативные сертификаты с помощью CURLOPT_CAINFOпараметра, или каталог сертификатов может быть указан с помощью CURLOPT_CAPATHпараметра.

Также посмотрите на CURLOPT_SSL_VERIFYHOST:

  • 1, чтобы проверить наличие общего имени в сертификате узла SSL.
  • 2, чтобы проверить наличие общего имени, а также убедиться, что оно соответствует указанному имени хоста.

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
клевер
источник
5
Отключение проверки SSL в любом случае в значительной степени снимает всю безопасность SSL. Вместо этого вам следует исправить конфигурацию PHP.
Scopey
7
@Scopey, но иногда он может понадобиться в локальных средах разработки с самозаверяющими сертификатами. Так что, вероятно, это не имеет смысла в непубличных средах, но в качестве напоминания всегда лучше иметь какое-то предупреждение в журнале (например SSL verification disabled)
Иван Борщов
2

У нас была такая же проблема на машине CentOS7. Отключение VERIFYHOST VERIFYPEERне решило проблему, у нас больше не было ошибки cURL, но ответ по-прежнему был недействительным. Выполнение wgetпо той же ссылке, что и cURL, также привело к ошибке сертификата.

-> Наше решение также заключалось в перезагрузке VPS, это решило проблему, и мы смогли снова выполнить запрос.

Нам показалось, что это проблема повреждения памяти. Перезагрузка VPS снова перезагрузила библиотеку в памяти, и теперь она работает. Поэтому, если вышеуказанное решение @cloverне работает, попробуйте перезагрузить компьютер.

Rvanlaak
источник
Убедитесь, что это не прерывисто. У меня была проблема с PayPal и одноранговой проверкой, где иногда это работало, иногда нет. Это казалось случайным. Явно настраивая путь кафе и сообщая curl, где была решена проблема.
Нил Дэвис