Я уже публиковал заметки на тему работы с CURL. Сегодня хочу рассказать как работать по протоколу HTTPS.
Вспомним, что для установки параметров соединения используется функция curl_setopt:
<?php
bool curl_setopt ( resource $ch , string $option , mixed $value )
//$ch – дескриптор сессии
//$option – устанавливаемый параметр
//$value – значение параметра, который устанавливает
?>
Вообще в идеале, для работы по протоколу HTTPS, ничего дополнительно настраивать не надо. На практике же все с точностью наоборот.
Для работы по протоколу HTTPS в большинстве случаев будет достаточно, отключить проверку сертификатов.
<?php
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
?>
CURLOPT_SSL_VERIFYPEER Установите этот параметр в ноль, чтобы запретить проверку сертификата удаленного сервера (начиная с curl 7.10, по умолчанию этот параметр имеет значение TRUE). Дополнительные сертификаты можно задать с помощью параметра CURLOPT_CAINFO (добавленного в curl 7.9.8). Можно также указать путь к файлам сертификатов в параметре CURLOPT_CAPATH . Если CURLOPT_SSL_VERIFYPEER установлен в 0, возможно, также потребуется установить CURLOPT_SSL_VERIFYHOST в 1 или 0 (по умолчанию 2).
CURLOPT_SSL_VERIFYHOST Задает проверку имени, указанного в сертификате удаленного сервера, при установлении SSL соединения. Значение 1 означает проверку существования имени, значение 2 — кроме того, и проверку соответствия имени хоста.
В некоторых случаях необходимо явно указать версию SSL протокола:
<?php
curl_setopt($ch, CURLOPT_SSLVERSION,2);
?>
CURLOPT_SSLVERSION Целое число, указывающее, какую версию SSL использовать (2 или 3). По умолчанию версия SSL определяется автоматически, но в некоторых случаях требуется явное указание.
Простой пример HTTPS запроса
<?php
$ch = curl_init();
//Указываем URL, куда будем обращаться. Протокол https://
curl_setopt($ch, CURLOPT_URL, 'https://www.yousoft.ru/');
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_USERAGENT, 'PHP Bot (https://www.yousoft.ru)');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$data = curl_exec($ch);
curl_close($ch);
?>
Использование сертификатов
Некоторые сервисы предлагают авторизацию по сертификату. CURL умеет работать с сертификатами в формате PEM.
<?php
//Имя сертификата
curl_setopt($ch, CURLOPT_SSLCERT, 'cert.pem');
//Пароль сертификата
curl_setopt($ch, CURLOPT_SSLCERTPASSWD,'certpass');
?>
CURLOPT_SSLCERT Имя файла с сертификатом в формате PEM.
CURLOPT_SSLCERTPASSWDПароль к файлу сертификата, заданному параметром CURLOPT_SSLCERT.
Если у вас нет сертификата в данном формате, можно сделать его из других форматов, например из PFX, который успешно используется в основных браузерах. Для того, чтобы выполнить такое преобразование, нам будет необходима программа OpenSSL. Установить ее не сложно, и описывать ее установку в рамках статьи не планируется. Предположим, что она уже установлена, тогда для того, чтобы выполнить необходимое нам преобразование достаточно выполнить команду:
#openssl pkcs12 -in cert.pfx -out cert.pem –nodes
Система попросит ввести пароль:
Enter Import Password:
Если пароль введен правильно, то вы увидите следующее сообщение:
MAC verified OK
Теперь нужно придумать новый пароль, но уже для PEM файл, который вы потом и будете передавать в качестве значения параметра CURLOPT_SSLCERTPASSWD.
Enter PEM pass phrase:
Ни и конечно попросит еще раз ввести пароль, вдруг вы ошиблись:
Verifying - Enter PEM pass phrase:
Теперь у нас есть PEM файл ‘cert.pem’, и мы можем спокойно подключаться к серверу:
Простой пример HTTPS запроса с аутентификацией на основе сертификата
<?php
$ch = curl_init();
//Указываем URL, куда будем обращаться. Протокол https://
curl_setopt($ch, CURLOPT_URL, 'https://www.yousoft.ru/');
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_USERAGENT, 'PHP Bot (https://www.yousoft.ru)');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
//Путь до сертификата
curl_setopt($ch, CURLOPT_SSLCERT, 'cert.pem');
//Пароль сертификата
curl_setopt($ch, CURLOPT_SSLCERTPASSWD,'certpass');
$data = curl_exec($ch);
curl_close($ch);
?>
На этом хочется закончить сегодняшний рассказ. Будут вопросы пишите.
Спасибо большое за статью, помогла разобраться с https соединением, а то у webmoney сертификаты как правило не подписанные.
Спасибо за статью, пригодилась.
И даже спустя пять лет самое начало статьи оказалось полезным!