Запрос POST с самозаверяющим сертификатом

Я собираюсь отправить POST некоторые данные с сайта A на сайт B с помощью PHP. Сайт A имеет коммерческий сертификат SSL. Сайт B будет иметь самозаверяющий сертификат. Это выполнимо? Если нет, есть ли какие-либо параметры конфигурации в PHP (или Apache), которые я могу установить для обхода ограничений?

Ответ 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/... по соображениям безопасности.