Пользователи часто задают вопрос: как парсить сайты защищенные ssl сертификатами. У cURL для этого есть специальные средства. Сертификат подключается, как обычный файл плюс файл с ключами. Единственное ограничение: cURL на php понимает только сертификаты формата pem, а большинство серверов работает на связке p12+crt
Значит нужно найти конвертор.
Для этого нужна библиотека openssl. Если у Вас linux, то она 100% у Вас уже стоит, и вы можете пропустить этот абзац. Для меня, как для windows пользователя, придумали специальные программы для запуска подобных пакетов. После недолгих поисков по сети я нашел cygwin. Если лень возиться с отдельной установкой OpenSSL и других попутных штук то лучше при установке кликните на установку всех пакетов.
Пакеты грузятся довольно долго, но после установки всех пакетов Вам будет доступен вот такой терминал
Берем файл *.p12 (его можно экспортировать из браузера) и бросаем его в папку C:/cygwin/home/
Далее в терминале с помощью команд cd .., ls, cd {path} переходим в папку home, если Вы еще не в ней, и запускаем следующую команду
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/"
У меня чё-то нельзя этот файл взять в мозиле функции нет, а в хроме запрещена опция. Как же его экспортировать?