Web

Проверка на сертификат в HTTPS и SSL3_GET_SERVER_CERTIFICATE

Я использую XAMPP для разработки. Недавно я обновил свою установку xampp со старой версии до 1.7.3. Теперь, когда я просматриваю сайты с поддержкой HTTPS, я получаю следующее исключение:

Fatal error: Необработанное исключение 'RequestCore_Exception' с сообщением 'cURL resource: Resource id #55; cURL error: SSL certificate problem, verify that the CA cert is OK. Подробности: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed (60)'

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

 

Ответ 1

Это довольно распространенная проблема в Windows. Вам нужно просто установить cacert.pem в curl.cainfo. Начиная с PHP 5.3.7, вы можете сделать следующее:

  1. Скачать https://curl.haxx.se/ca/cacert.pem и сохранить его где-нибудь.

  2. Обновить php.ini -- добавить curl.cainfo = "PATH_TO/cacert.pem".

В противном случае вам нужно будет сделать следующее для каждого ресурса cURL:

curl_setopt ($ch, CURLOPT_CAINFO, "PATH_TO/cacert.pem");

 

Ответ 2

Curl: Проблема с сертификатом SSL, проверьте, что сертификат CA в порядке.

При открытии защищенного url с помощью Curl вы можете получить следующую ошибку:

SSL certificate problem, verify that the CA cert is OK

 Я объясню, почему возникает эта ошибка и что вам следует с ней делать.

Самым простым способом избавиться от ошибки будет добавление следующих двух строк в ваш скрипт. Это решение представляет риск для безопасности.

//WARNING: это не позволит curl обнаружить атаку "злоумышленник на линии".

curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);

curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0); 

 

Давайте посмотрим, что делают эти два параметра. Цитируем руководство.

CURLOPT_SSL_VERIFYHOST:

  1. Для проверки существования общего имени в сертификате SSL пиров. 

  2. Для проверки существования общего имени, а также проверки его соответствия предоставленному имени хоста.

CURLOPT_SSL_VERIFYPEER: 

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

CURLOPT_SSL_VERIFYHOST может также иметь значение TRUE или FALSE, если CURLOPT_SSL_VERIFYPEER отключен (по умолчанию он равен 2). Установка CURLOPT_SSL_VERIFYHOST в 2 (это значение по умолчанию) гарантирует, что сертификат, представленный вам, имеет «общее имя», совпадающее с URN, которое вы используете для доступа к удаленному ресурсу. Это полезная проверка, но она не гарантирует, что ваша программа не будет скомпрометирована.

Если обнаружено, что «злоумышленник на линии»

Ваша программа может быть введена в заблуждение и вместо этого обратиться к другому серверу. Это может быть достигнуто с помощью нескольких механизмов, таких как отравление dns или arp. Злоумышленник также может самостоятельно подписать сертификат с тем же 'comon name', которое ожидает ваша программа. Взаимодействие будет по-прежнему зашифровано, но вы выдадите свои секреты самозванцу. Такой вид атаки называется «злоумышленник на линии».

Решение ситуации  «злоумышленник на линии»

Нам нужно убедиться, что представленный нам сертификат действительно корректный. Для этого мы сравниваем его с сертификатом, которому мы можем доверять. Если удаленный ресурс защищен сертификатом, выданным одним из основных CA, таких как Verisign, GeoTrust и т.д., вы можете смело сравнивать его с пакетом сертификатов CA Mozilla, который можно получить по адресу http://curl.haxx.se/docs/caextract.html.

Сохраните файл cacert.pem где-нибудь на вашем сервере и установите следующие опции в вашем скрипте:

curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, TRUE); 

curl_setopt ($ch, CURLOPT_CAINFO, "pathto/cacert.pem");

 

Ответ 3

В моем случае мне пришлось установить переменную конфигурации PHP openssl.cafile на путь к PEM-файлу. Есть много систем, где установка curl.cainfo в конфигурации PHP это именно то, что нужно, но в среде, с которой я работаю, а это докер-контейнер eboraas/laravel, который использует Debian (jessie) и PHP 5.6, установка этой переменной не помогла.

Я заметил, что в выводе php -i ничего не говорится об этом конкретном параметре конфигурации, но там есть несколько строк об openssl. Там есть опции openssl.capath и openssl.cafile, но только установка второй опции позволила curl через PHP наконец-то нормально работать с HTTPS URL.

 

Ответ 4

Иногда, если приложение, с которым вы пытаетесь связаться, имеет самоподписанные сертификаты, обычный cacert.pem с http://curl.haxx.se/ca/cacert.pem не решает проблему. Если вы уверены в url конечной точки сервиса, зайдите на нее через браузер, сохраните сертификат вручную в формате «X 509 certificate with chain (PEM)». Укажите на этот файл сертификата с помощью:

curl_setopt ($ch, CURLOPT_CAINFO, "pathto/{downloaded certificate chain file}"); 

 

Ответ 5

Вот мое решение, если оно кому-то поможет. Посмотрите на цепочку сертификатов для того домена, который выдает ошибку. Для меня это был googleapis.com

openssl s_client -host www.googleapis.com -port 443

 

В ответ вы получите что-то вроде этого:

Certificate chain

 0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=*.googleapis.com

   i:/C=US/O=Google Inc/CN=Google Internet Authority G2

 1 s:/C=US/O=Google Inc/CN=Google Internet Authority G2

   i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA

 2 s:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA

   i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority

 

Примечание: Я получил это после того, как исправил проблему; для вашей цепочки вывод может выглядеть иначе.

После этого вам нужно посмотреть на сертификаты, разрешенные в php. Запустите phpinfo() на странице.

<?php echo phpinfo();

 

Затем найдите файл сертификата, который загружается из вывода страницы:

openssl.cafile  /usr/local/php5/ssl/certs/cacert.pem

 

Это файл, который вам нужно исправить, добавив в него правильный(-ые) сертификат(ы).

sudo nano /usr/local/php5/ssl/certs/cacert.pem

 

В основном вам нужно добавить правильные «подписи» сертификатов в конец этого файла. Вы можете найти некоторые из них здесь: 

  1. https://pki.google.com/

  2. https://www.geotrust.com/resources/root-certificates/index.html

Сертификаты выглядят следующим образом:

example certificate image

Когда нужные сертификаты будут в этом файле, перезапустите apache и протестируйте код.

 

Схожие статьи

Как добавить сайт в каталог Dmoz.org, насколько просто туда попасть
Web

Как добавить сайт в каталог Dmoz.org, насколько просто туда попасть

Web

Как я могу измерить скорость кода, написанного на PHP

Web

Почему json_encode возвращает пустую строку

Web

Как выполнить цикл по массиву в php с форматированным html оформлением?

×