Curl: проблема с сертификатом SSL, убедитесь, что сертификат CA в порядке
07 апреля 2006 г.
При открытии защищенного URL с помощью Curl вы можете получить следующую ошибку:
Проблема с сертификатом SSL, проверьте, что сертификат CA в порядке
Я объясню, почему ошибка и что вы должны с этим делать.
Самый простой способ избавиться от ошибки - добавить следующие две строки в ваш скрипт. Это решение создает угрозу безопасности.
//WARNING: this would prevent curl from detecting a 'man in the middle' attack
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, который вы используете для доступа к удаленному ресурсу. Это здоровая проверка, но она не гарантирует, что ваша программа не будет принята.
Введите «человек посередине»
Ваша программа может быть введена в заблуждение, чтобы вместо этого общаться с другим сервером. Это может быть достигнуто с помощью нескольких механизмов, таких как отравление днс или арп (это история для другого дня). Злоумышленник также может самостоятельно подписать сертификат с тем же именем, что и ваша программа. Сообщение будет по-прежнему зашифровано, но вы будете передавать свои секреты самозванцу. Этот вид атаки называется «человек посередине»
Победить «человека посередине»
Что ж, нам нужно убедиться, что представленный нам сертификат действительно хорош. Мы делаем это, сравнивая его с сертификатом, которому мы разумно * доверяем.
Если удаленный ресурс защищен сертификатом, выпущенным одним из главных центров сертификации, таким как 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");