PHP, CURL, получение данных с HTTPS
От: F1aSh  
Дата: 30.03.09 14:21
Оценка:
Задача:
1. Зайти на https://example/ при помощи логина и пароля
2. Сграбить данные

Решение:
Название файла: parser.php
Кодировка файла: UTF-8
Содержимое файла:

// ШАГ 1
/*********************************************************
 *  ЗАЛОГИНИЛИСЬ И ПОЛУЧИЛИ ОТВЕТ ОТ QueryProcess : LOGIN
 ********************************************************/
$ch = curl_init();
$LOGIN = 'ЗАКРЫТО ИБО ОЧЕНЬ КОНФЕДЕНЦИАЛЬНО';
$PASSWD = 'ЗАКРЫТО ИБО ОЧЕНЬ КОНФЕДЕНЦИАЛЬНО';
$USER = 'ЗАКРЫТО ИБО ОЧЕНЬ КОНФЕДЕНЦИАЛЬНО';
$curl_data = "qid=CHECKACCOUNT&login_id=$LOGIN&password=$PASSWD&user_id=$USER&lang=1";
$options = array(
        CURLOPT_URL             => 'https://СЕРВЛЕТ ДЛЯ ОБРАБОТКИ ЗАПРОСОВ', // тоже закрыт. тоже конфеденциально
        CURLOPT_RETURNTRANSFER    => true,         // DONT OUTPUT INTO BROWSER
        CURLOPT_HEADER            => false,        // DONT RETURN HEADERS
        CURLOPT_FOLLOWLOCATION    => true,         // FOLLOWING REDIRECTS
        CURLOPT_ENCODING        => "",           // ALL ENCODINGS
        CURLOPT_USERAGENT        => "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)",     // I AM MOZILLKO 4.0
        CURLOPT_AUTOREFERER        => true,         // REFERER ON REDIRECTS
        CURLOPT_CONNECTTIMEOUT    => 120,          // TIMEOUT FOR CONNECTION
        CURLOPT_TIMEOUT            => 120,          // RESPONSE TIMEOUT
        CURLOPT_MAXREDIRS        => 10,           // MAX REDIRECTS 10
        CURLOPT_POST            => 1,            // IM SENDING POST DATA
        CURLOPT_REFERER            => 'http://ВАЛИЖНЫЙ РЕФЕРЕР',
        CURLOPT_POSTFIELDS        => $curl_data,    // POST DATA STRING
        CURLOPT_SSL_VERIFYHOST    => 0,            // DONT VERIFY SSL HOST
        CURLOPT_SSL_VERIFYPEER    => false,        // DONT VERIFY SSL PEER
        CURLOPT_VERBOSE            => 1,                // 
        CURLOPT_HTTPHEADER        => array('Content-Type: application/x-www-form-urlencoded')
   );
curl_setopt_array($ch, $options);
$res = curl_exec($ch); // То, что отдает нам сервлет
$info = curl_getinfo($ch); // информация (сколько длился запрос, какой http код отдал сервлет и т.д.)
if (curl_errno($ch)>0)
print curl_error($ch); // ВЫВОДИМ ОШИБКУ, ЕСЛИ ЕСТь
curl_close($ch);
$res = trim($res);


SSL версия 3 (сервер)

Дело в том, что у меня это работает прекрасно на моем виртуальном хосте и данные прилетают.
phpinfo мой:
PHP Version 5.2.4
cURL support enabled
cURL Information libcurl/7.16.0 OpenSSL/0.9.8d zlib/1.2.3

После переноса на хостинг получил ошибку
error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure
Закинул этот же скрипт еще на один хостинг. Получил ту же ошибку.

phpinfo хостинг 1:
PHP Version 5.2.8
cURL support enabled
cURL Information libcurl/7.19.2 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5

phpinfo хостинг 2: (то же самое, что и на первом как оказалось)
PHP Version 5.2.8
cURL support enabled
cURL Information libcurl/7.19.2 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5


6 часов (а может больше) "гуглинга" интернета не дали ровно ничего. Сертификат по всей видимости не требуется, т.к. на локалке у меня все работает, но я все таки пытался подсунуть "какой то" (я в этом плане не очень хорошо разбираюсь — информацию по SLL/OpenSSL читал, но глубинных знаний нет). Пытался указывать CURLOPT_COOKIEJAR, Пытался указывать CURLOPT_SSLAUTH, убирать автореферрер, указывать другой юзер-агент/не указывать юзер-агент... в общем, всего описать сейчас не смогу, но буквально уже выбился из сил. Не дает покоя то, что на локалке работает всё замечательно.

На локалке: Windows XP SP2, Denwer (Apache)
На хостингах: Unix, Apache

При том почти любой сайт (даже тот, который требует сертификат) удавалось считать как на локалке, так и на хостинге.

Кто сталкивался? Возможные пути решения? В чем (может быть) проблема?... Буду благодарен откликнувшимся.
Re: PHP, CURL, получение данных с HTTPS
От: Константин  
Дата: 31.03.09 08:40
Оценка:
Здравствуйте, F1aSh, Вы писали:

FS>error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure



FS>6 часов (а может больше) "гуглинга" интернета не дали ровно ничего.



гугли "CURL" + текст ошибки, уже среди первых ссылок есть полезные
Re[2]: PHP, CURL, получение данных с HTTPS
От: F1aSh  
Дата: 31.03.09 16:26
Оценка:
Здравствуйте, Константин, Вы писали:

К>Здравствуйте, F1aSh, Вы писали:


FS>>error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure



FS>>6 часов (а может больше) "гуглинга" интернета не дали ровно ничего.



К>гугли "CURL" + текст ошибки, уже среди первых ссылок есть полезные


Тыкните меня пожалуйста носом, как котенка, — в упор не вижу. Всего 5 ссылок (не считая ссылки на эту тему форума) и ничего полезного по этим ссылкам. По одной из ссылок скачал Hack Notes Web Security Portable Reference — сейчас начал изучать/читать, а проблему нужно решить до пятницы Завтра поставлю наверное на второй комп OpenSUSE 10.3 — проверю как на линуксе работает, хотя что-то мне не особо верится, что это из-за системы как-то зависит.
Выдрал при помощи FireBug'a (плагин Mozilla FF) сертификат — пытался впихнуть — ноль эмоций, — та же ошибка, а на винде так вообще какие-то ругательства в сторону сертификата. Если указываю в опциях CURL SSL_VERIFYPEER 0, VERIFYHOST 0 — снова работает (но это, опять же, у меня работает, а не на хостинге). Файл куки проверял после исполнения скрипта... Если указываю какой-то другой https-адрес — там чего-то генерится... в моём случае такое ощущение, что связь с сервлетом прекращается почти сразу после запроса:
[namelookup_time] => 4.4E-5
[connect_time] => 0.296929
тому подтверждение. То есть попытка законнектиться -> handshake failure
инфу надо дергать с японских автомобильных аукционов. На них всё устроено так, что при определенной операции (например при запросе аукциона) данные передаются в сервлет асинхронно, а далее всё это дело парсится... По сути я уже во всем разобрался, т.е. на локалке я парсю все аукционы нормально... Мне бы вот только эту траблу решить и всё будет просто чудесно. Если не сложно, тыкните, плиз, носом, да пожесче, чтоб я прозрел
Re[3]: PHP, CURL, получение данных с HTTPS
От: Константин  
Дата: 31.03.09 18:59
Оценка:
Конкретно с такой проблемой не сталкивался, хотя задача знакома. Поэтому могу только дать общие советы
Во-первых, создается ощущение, что CURL запрос сразу оформлялся с таким количеством настроек. Если это так, то попробуй упростить задачу, задав минимум опций(url, header, post, postfields, returntransfer), а затем увеличивай, пока не перестанет работать.
Хотя думаю, проблема все же с SSL.
Попробуй обратиться к сервлету напрямую, без CURL, но c использованием SSL.
От системы действительно, вряд ли что-то зависит, скорее, от настроек апача, php и ssl, попробуй их повторить на хостинге. Или же, наоборот, повторить настройки хостинга на какой-то виртуалке.
Еще раз внимательно почитай http://ru2.php.net/manual/ru/book.curl.php Потом все комменты. Потом все комменты к каждой curl-функции на предмет проблем с ssl
Ну и ссылки, может уже видел, а может и помогут

http://ca.grid.kiae.ru/RDIG/info/faq.html
http://curl.haxx.se/mail/lib-2009-03/0325.html
http://bugs.gentoo.org/198914
http://www.mail-archive.com/openssl-users@openssl.org/msg47543.html
http://www.paypaldeveloper.com/pdn/board/message?board.id=nvp&thread.id=946
http://forums11.itrc.hp.com/service/forums/questionanswer.do?threadId=1229925
http://bugs.php.net/bug.php?id=33192&edit=2
http://www.nabble.com/ssl-handshake-failure-td13932843.html
Re: PHP, CURL, получение данных с HTTPS
От: Аноним  
Дата: 17.08.09 05:13
Оценка:
Нужно сделать
curl_setopt( $ch, CURLOPT_SSLVERSION, 3 );
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.