Используем CURL (php) часть 3 (протокол — HTTPS, SSL соединение)


Я уже публиковал заметки на тему работы с CURL. Сегодня хочу рассказать как работать по протоколу HTTPS.

Изучаем curl

Вспомним, что для установки параметров соединения используется функция curl_setopt:

  1. <?php
  2. bool curl_setopt ( resource $ch , string $option , mixed $value )
  3. //$ch – дескриптор сессии
  4. //$option – устанавливаемый параметр
  5. //$value – значение параметра, который устанавливает
  6. ?>

Вообще в идеале, для работы по протоколу HTTPS, ничего дополнительно настраивать не надо. На практике же все с точностью наоборот.

Для работы по протоколу HTTPS в большинстве случаев будет достаточно, отключить проверку сертификатов.

  1. <?php
  2. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  3. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
  4. ?>

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 протокола:

  1. <?php
  2. curl_setopt($ch, CURLOPT_SSLVERSION,2);
  3. ?>

CURLOPT_SSLVERSION Целое число, указывающее, какую версию SSL использовать (2 или 3). По умолчанию версия SSL определяется автоматически, но в некоторых случаях требуется явное указание.

Интересная студия www.inclouds.ru. В портфолио понравился «Эскизы сайта для компании Интеби». Еще и с юмором, смотрим «keywords» главной страницы. 🙂

Простой пример HTTPS запроса

  1. <?php
  2. $ch = curl_init();
  3. //Указываем URL, куда будем обращаться. Протокол https://
  4. curl_setopt($ch, CURLOPT_URL, 'https://blog.yousoft.ru/');
  5. curl_setopt($ch, CURLOPT_HEADER, false);
  6. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  7. curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
  8. curl_setopt($ch, CURLOPT_USERAGENT, 'PHP Bot (http://blog.yousoft.ru)');
  9. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  10. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
  11. $data = curl_exec($ch);
  12. curl_close($ch);
  13. ?>

Использование сертификатов

Некоторые сервисы предлагают авторизацию по сертификату. CURL умеет работать с сертификатами в формате PEM.

  1. <?php
  2. //Имя сертификата
  3. curl_setopt($ch, CURLOPT_SSLCERT, 'cert.pem');
  4. //Пароль сертификата
  5. curl_setopt($ch, CURLOPT_SSLCERTPASSWD,'certpass');
  6. ?>

CURLOPT_SSLCERT Имя файла с сертификатом в формате PEM.

CURLOPT_SSLCERTPASSWDПароль к файлу сертификата, заданному параметром CURLOPT_SSLCERT.

Если у вас нет сертификата в данном формате, можно сделать его из других форматов, например из PFX, который успешно используется в основных браузерах. Для того, чтобы выполнить такое преобразование, нам будет необходима программа OpenSSL. Установить ее не сложно, и описывать ее установку в рамках статьи не планируется. Предположим, что она уже установлена, тогда для того, чтобы выполнить необходимое нам преобразование достаточно выполнить команду:

  1. #openssl pkcs12 -in cert.pfx -out cert.pem –nodes

Система попросит ввести пароль:

  1. Enter Import Password:

Если пароль введен правильно, то вы увидите следующее сообщение:

  1. MAC verified OK

Теперь нужно придумать новый пароль, но уже для PEM файл, который вы потом и будете передавать в качестве значения параметра CURLOPT_SSLCERTPASSWD.

  1. Enter PEM pass phrase:

Ни и конечно попросит еще раз ввести пароль, вдруг вы ошиблись:

  1. Verifying — Enter PEM pass phrase:

Теперь у нас есть PEM файл ‘cert.pem’, и мы можем спокойно подключаться к серверу:

Простой пример HTTPS запроса с аутентификацией на основе сертификата

  1. <?php
  2. $ch = curl_init();
  3. //Указываем URL, куда будем обращаться. Протокол https://
  4. curl_setopt($ch, CURLOPT_URL, 'https://blog.yousoft.ru/');
  5. curl_setopt($ch, CURLOPT_HEADER, false);
  6. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  7. curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
  8. curl_setopt($ch, CURLOPT_USERAGENT, 'PHP Bot (http://blog.yousoft.ru)');
  9. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  10. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
  11. //Путь до сертификата
  12. curl_setopt($ch, CURLOPT_SSLCERT, 'cert.pem');
  13. //Пароль сертификата
  14. curl_setopt($ch, CURLOPT_SSLCERTPASSWD,'certpass');
  15. $data = curl_exec($ch);
  16. curl_close($ch);
  17. ?>

На этом хочется закончить сегодняшний рассказ. Будут вопросы пишите.

Похожие записи:

Tags:

3 комментария to “Используем CURL (php) часть 3 (протокол — HTTPS, SSL соединение)”

  1. Спасибо большое за статью, помогла разобраться с https соединением, а то у webmoney сертификаты как правило не подписанные.

  2. Спасибо за статью, пригодилась.

  3. ZZ:

    И даже спустя пять лет самое начало статьи оказалось полезным!

Leave a Reply