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

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

Кто сталкивался? Возможные пути решения? В чем (может быть) проблема?... Буду благодарен откликнувшимся.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.