Я собираюсь отправить POST некоторые данные с сайта A на сайт B с помощью PHP. Сайт A имеет коммерческий сертификат SSL. Сайт B будет иметь самозаверяющий сертификат. Это выполнимо? Если нет, есть ли какие-либо параметры конфигурации в PHP (или Apache), которые я могу установить для обхода ограничений?
Запрос POST с самозаверяющим сертификатом
Ответ 1
Предположительно, вы будете использовать завиток на сервере A? Там пара опций в curl, чтобы отключить проверку сертификата, которая разрешит самозаверяющие сертификаты. Ссылка будет по-прежнему зашифрована, но вы не сможете доверять тому, что сервер B действительно IS сервер B:
curlopt_ssl_verifypeer (checking the CA auth chain)
curlopt_ssl_verifyhost (hostname/certname match checks)
Пример кода PHP:
$ch = curl_init("https://example.com/example/path");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$response = curl_exec($ch);
Ответ 2
Это выполнимо. В PHP, если вы используете cURL для выполнения POST, вам просто нужно установить для параметров CURLOPT_SSL_VERIFYPEER
и CURLOPT_SSL_VERIFYHOST
значение false, чтобы он не терпел неудачу, потому что сертификат сам подписан.
Ответ 3
Если вы запрашиваете у браузера POST данные, тогда пользователь получит обычные предупреждения о том, что сертификат не заслуживает доверия.
Если вы используете cURL для выполнения POST из вашего PHP-кода, вам нужно отключить проверки cURL SSL. Согласно связанному вопросу,
Вам нужно установить
CURLOPT_SSL_VERIFYPEER
иCURLOPT_SSL_VERIFYHOST
вFALSE
. Это должно > отключить две основные проверки. Возможно, они оба не потребуются, но это должно по крайней мере заставить вас идти.
Ответ 4
В моем случае только мой сервер разработки является самоподписанным, поэтому я установил для параметра verifypeer значение false, и оно работает. Но мой рабочий сервер полностью подписан, поэтому я не устанавливаю опцию verifypeer. В любом случае опция verifyhost не нужна.
Ответ 5
Ответы, предлагающие отключить CURLOPT_SSL_VERIFYPEER
не принимаются. Вопрос в том, почему он не работает с cURL, и, как правильно указано, это опасно. Отключение проверок сертификатов открывает двери для атакующих пользователей, что приближается к использованию простого текста http.
Ошибка, вероятно, вызвана отсутствием актуальной пачки корневых сертификатов CA. Обычно это текстовый файл с набором криптографических подписей, которые curl использует для проверки SSL-сертификата хоста.
Вам необходимо убедиться, что в вашей установке PHP есть один из этих файлов и он обновлен (в противном случае загрузите его здесь: http://curl.haxx.se/docs/caextract.html).
Затем установите в php.ini:
curl.cainfo = <absolute_path_to> cacert.pem
Если вы устанавливаете его во время выполнения, используйте:
curl_setopt ($ch, CURLOPT_CAINFO, dirname(__FILE__)."/cacert.pem");
Ответ скопирован с fooobar.com/info/165604/... по соображениям безопасности.