Пользователи часто задают вопрос: как парсить сайты защищенные ssl сертификатами. У cURL для этого есть специальные средства. Сертификат подключается, как обычный файл плюс файл с ключами. Единственное ограничение: cURL на php понимает только сертификаты формата pem, а большинство серверов работает на связке p12+crt
Значит нужно найти конвертор.
Для этого нужна библиотека openssl. Если у Вас linux, то она 100% у Вас уже стоит, и вы можете пропустить этот абзац. Для меня, как для windows пользователя, придумали специальные программы для запуска подобных пакетов. После недолгих поисков по сети я нашел cygwin. Если лень возиться с отдельной установкой OpenSSL и других попутных штук то лучше при установке кликните на установку всех пакетов.
Пакеты грузятся довольно долго, но после установки всех пакетов Вам будет доступен вот такой терминал
Берем файл *.p12 (его можно экспортировать из браузера) и бросаем его в папку C:/cygwin/home/
Далее в терминале с помощью команд cd .., ls, cd {path} переходим в папку home, если Вы еще не в ней, и запускаем следующую команду
1 | openssl pkcs12 -in file.p12 -out keys.pem -nocerts |
программа попросит ввести пароль от сертификата. И другой пароль, который следует запомнить, к примеру 11111, затем повторить его.
Так мы сгенерировали файл с ключами. Теперь нужно сгенерировать файл с сертификатами.
openssl pkcs12 -in cert.p12 -out cert.pem -nokeys -clcerts |
Нам потребуется еще один сертификат - сертификат сервера. Он имеет расширение crt, и отдается сервером при первом заходе.
Теперь у нас есть 3 файла. Создайте на своем веб-сервере файл index.php, рядом с ним положите эти три файла keys.pem, cert.pem и ca.crt
В index.php пишем
<?php $curl = curl_init(); curl_setopt( $curl ,CURLOPT_URL, "https://sitename.ru/" ); curl_setopt( $curl ,CURLOPT_HEADER,true); curl_setopt( $curl , CURLOPT_FAILONERROR, 1); curl_setopt( $curl , CURLOPT_FOLLOWLOCATION, 1); curl_setopt( $curl ,CURLOPT_POST,0); curl_setopt( $curl ,CURLOPT_RETURNTRANSFER,1); curl_setopt( $curl ,CURLOPT_SSL_VERIFYHOST,2); curl_setopt( $curl ,CURLOPT_SSL_VERIFYPEER,true); curl_setopt( $curl ,CURLOPT_CAINFO, getcwd (). '/ca.crt' ); curl_setopt( $curl ,CURLOPT_SSLCERT, getcwd (). '/cert.pem' ); curl_setopt( $curl ,CURLOPT_SSLCERTPASSWD, "11111" ); curl_setopt( $curl ,CURLOPT_SSLCERTTYPE, "PEM" ); curl_setopt( $curl ,CURLOPT_SSLKEY, getcwd (). '/keys.pem' ); curl_setopt( $curl ,CURLOPT_SSLKEYPASSWD, "11111" ); if ( $data = curl_exec( $curl )) echo $data ; else echo curl_error( $curl ); curl_close( $curl ); |
Вот так и парсим сайты со сложной системой защиты. На всякий случай предупрежу: не стоит парсить все подряд, ведь если ресурс защищен такого рода защитой, то там и сидят не дураки. Достаточно того, что сертификат, котороый у Вас есть уникален и по информации из него достаточно легко Вас идентифицировать. Поэтому сперва узнайте владельца домена, а уже потом предпринимайте различные действия. Ведь Вам будет очень неприятно, если вы проводя свои эксперименты с сертификатом своего банка, вдруг будете им забанены.
Будьте осторожны,желаю удачи.
Информация размещена лишь в ознакомительных целях, только для демонстрации технологии ssl+curl+php
Комментарии
и все странным образом начинает работать
у меня нет при экспорте *.p12, есть *.crt . Подойдет .crt ?
только почему бы Важные моменты подробнее не описать?
"Берем файл *.p12 (его можно экспортировать из браузера) и бросаем его в папку C:/cygwin/home/"
У меня чё-то нельзя этот файл взять в мозиле функции нет, а в хроме запрещена опция. Как же его экспортировать?