Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Ввод/Вывод, Сеть. Межпроцессное взаимодействие _ QNetworkAccessManager и SSL

Автор: eldar85 23.11.2010, 22:25

Странная вещь, сделал программу клиент для mail.ru по заказу клиента, программа логинется и проверяет есть ли новые письма, кто постучался в гости в друзья в моем мире и позвал в сообщества.
так вот программа у меня логинится нормально, еще на одном компе своем пробывал запускать тоже нормально, а у клиента не логинется... зашел к нему через тиам вьювер и настроил все и все равно ответ от сервера нулевой.
потом попытался просто google.ru и mail.ru загрузить, грузит отлично, потом обратил внимание что логинка на mail.ru идет через https://auth.mail.ru/cgi-bin/auth а тут соединение с сервером идет через ssl.
попробывал еще у нескольких людей запустить программу вышло из 10 попыток у 6 работает у 4х пользователей нет, просто не логинится и никакого ответа сервера не выдает...

    request.setUrl(QUrl(load_url));
    request.setRawHeader("User-Agent",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.8) Gecko/20100722 MRA 5.6 (build 03402)
Firefox/3.6.8 (.NET CLR 3.5.30729) sputnik 2.0.1.41 WebMoney Advisor");
    request.setRawHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
    request.setRawHeader("Accept-Language", "ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3");
    request.setRawHeader("Accept-Charset", "windows-1251,utf-8;q=0.7,*;q=0.7");


    if(referer != "")
        request.setRawHeader( "Referer", referer.toUtf8() );

    if(cookie != "")
        request.setRawHeader( "Cookie", cookie.toUtf8() );

    if(proxy != "" && with_proxy)
    {
        ip_port = proxy.split(":");

        if( ip_port.length() == 2 )
        {
            tmp = ip_port[1];
            port = tmp.toInt();

            if( http_socks5 )
                manager.setProxy(QNetworkProxy(QNetworkProxy::HttpProxy, ip_port[0], port));
            else
                manager.setProxy(QNetworkProxy(QNetworkProxy::Socks5Proxy, ip_port[0], port));
        }
    }

    if(post_data == "")
        reply = manager.get( request );
    else
        reply = manager.post( request, post_data );


    QObject::connect( reply, SIGNAL( finished() ), &loop, SLOT( quit() ) );
    QObject::connect( &timer, SIGNAL( timeout() ), &loop, SLOT( quit() ) );

    QObject::connect( reply, SIGNAL(sslErrors(QList<QSslError>)), reply, SLOT(ignoreSslErrors()));

    timer.start(30000);
    loop.exec();

    cookie_loaded = reply->rawHeader("Set-Cookie");

    location = reply->rawHeader("Location");

    QByteArray buf = reply->readAll();

    headers = reply->rawHeaderList();


вот такая функция для работы с сетью... может библиотек каких не хватает у тех клинтов, или ХЗ... я им вместе с прогой пять обязательных скидывал - QtNetwork4.dll, QtCore4.dll, mingwm10.dll, libgcc_s_dw2-1.dll, QtGui4.dll

Автор: ufna 23.11.2010, 23:03

по-моему для работы с SSL надо OpenSSL вкомпиливать в кутэ

Автор: eldar85 23.11.2010, 23:49

у меня openSSL установлен на компе, я клиенту тоже устанавливал openSSL на комп и не дало результата... я думаю тоже что в кьюти нужно кампилировать но не знаю как и какие либы... наверное libssl32.dll libssl.dll но как это сделать не знаю...

вот нашел кое что
Из папки c OpenSSL \lib нужно скопировать файлы: libeay32.lib ssleay32.lib

в папку Qt qt\lib

Из папки с OpenSSL \lib\MinGW скопировать все файлы в папку Qt \mingw\lib

Из папки c OPenSSL \include скопировать папку openssl со всем содержимым в папку Qt \qt\include

Запустить "Qt Command Prompt" (C:\WINDOWS\system32\cmd.exe /K C:\Qt\2009.02\bin\qtenv.bat) и вписать в команду configure ключ -openssl-linked

только в CMD не получается запустить C:\WINDOWS\system32\cmd.exe /K F:\Qt\bin\qtenv.bat configure -openssl-linked


F:\Documents and Settings\Admin>F:\Qt\bin\qtenv.bat configure -openssl-linked
Setting up a MinGW/Qt only environment...
-- QTDIR set to F:\Qt\qt
-- PATH set to F:\Qt\qt\bin
-- Adding F:\Qt\bin to PATH
-- Adding F:\WINDOWS\System32 to PATH
-- QMAKESPEC set to win32-g++


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

Автор: eldar85 24.11.2010, 0:43

Разабрался... у меня в C:\WINDOWS\system32 лежат libeay32.lib и libssl32.lib поэтому и работает норм на моем компе, попробывал удалить эти дви дллки и все. соединение тут же пропало)) закинул к ехешнику и норм, в общем к программе теперь нужно будет подкинуть эти две дллки и все путем работает))

Автор: eldar85 24.11.2010, 12:25

вопрос не закрыт, соединения у людей так и не появилось...

Автор: eldar85 24.11.2010, 13:24

уже и добавил

QObject::connect( reply, SIGNAL(sslErrors(QList<QSslError>)), reply, SLOT(ignoreSslErrors()));

чтобы на ошибки ссл соединения забивал, все равно в ответе от сервера пусто

Автор: eldar85 24.11.2010, 13:56

все методы из сети использованы... толи что то не то делаю...

Автор: eldar85 25.11.2010, 14:51

ниужели никто не сталкивался с такой проблемой???

Автор: kwisp 25.11.2010, 15:30

Цитата(eldar85 @ 25.11.2010, 14:51) *
ниужели никто не сталкивался с такой проблемой???

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

Автор: Iron Bug 25.11.2010, 16:37

снимай снифером логи обмена пакетами. может, банально файрвол зарубает или ещё что. какой-нить брандмауэр или хостер.
ну и, как вариант, настройки почтовика у клиентов: иногда для доступа к почте по POP или IMAP на самом сервере надо галочки проставлять сначала, а так просто тупо не будет коннектиться.

Автор: eldar85 25.11.2010, 23:33

я снифером и смотрел. Там сначала вводишь логин и пароль на странице mail.ru затем она перекидывает на https://auth.mail.ru/cgi-bin/auth и там уже пост запросом вводит эти данные чтобы залогиниться.
причем проблема не имено в https://auth.mail.ru/cgi-bin/auth а в любых сайтах где конект идет через SSL пробывал несколько сайтов грузить с https но та же ерунда, просто нулевой ответ.

проблему уже вдоль и попрек перебераю, уже почти неделю бьюсь и вообще толку ноль...

Автор: BRE 25.11.2010, 23:45

А посмотри на сигнал:
void QNetworkAccessManager::authenticationRequired ( QNetworkReply * reply, QAuthenticator * authenticator ) [signal]

Автор: kwisp 26.11.2010, 9:14

eldar85,
напиши хоть как все решилось.

Автор: eldar85 26.11.2010, 9:21

не решилось пока, не могу ничего нарыть...

этот сигнал

void QNetworkAccessManager::authenticationRequired ( QNetworkReply * reply, QAuthenticator * authenticator ) [signal]

даже не знаю куда воткнуть в мой код

Автор: eldar85 26.11.2010, 15:14

void QNetworkAccessManager::authenticationRequired ( QNetworkReply * reply, QAuthenticator * authenticator )   [signal]


Этот сигнал вырабатывается в любое время, когда конечный сервер запросит аутентификацию перед доставкой запрошенного содержимого. Слот, соединённый с этим сигналом, должен заполнять аутентификационную информацию для содержимого (которые могут быть определены просмотром объекта reply) в объекте authenticator.

QNetworkAccessManager кэширует эту информацию и будет посылать те же данные если сервер запросит аутентификацию снова без вырабатывания сигнала authenticationRequired(). Если сервер отклонит эти данные, этот сигнал будет выработан снова.

хммм а с чем же его соединять то???

Автор: BRE 26.11.2010, 15:22

Со своим слотом, в котором и заполнять информацию для авторизации в объекте QAuthenticator, указатель на который передается в параметрах сигнала.

Автор: eldar85 26.11.2010, 21:46

не думаю я что проблема в аутификации, у меня то на компе она работает, а у некоторых не работает, такое ощущение что имено библиотек каких то не хватает... потому что у себя если из system32 удаляю libssl.dll то прога тут же перестает соединять с сервером, а ставлю на место работает. клиенту все забросил, в дополнение еще и ехе файлу дллки подкинул, но вот чего то не хватает...

Автор: BRE 26.11.2010, 21:47

Ну я только предположил, может и не в ней.

Автор: eldar85 26.11.2010, 21:52

вот это вот интересно как пишут троли

Из папки c OpenSSL \lib нужно скопировать файлы: libeay32.lib ssleay32.lib
в папку Qt qt\lib
Из папки с OpenSSL \lib\MinGW скопировать все файлы в папку Qt \mingw\lib
Из папки c OPenSSL \include скопировать папку openssl со всем содержимым в папку Qt \qt\include
Запустить "Qt Command Prompt" (C:\WINDOWS\system32\cmd.exe /K C:\Qt\2009.02\bin\qtenv.bat) и вписать в команду configure ключ -openssl-linked
только в CMD не получается запустить C:\WINDOWS\system32\cmd.exe /K F:\Qt\bin\qtenv.bat configure -openssl-linked

F:\Documents and Settings\Admin>F:\Qt\bin\qtenv.bat configure -openssl-linked

получил вот это, но разобраться в полученом не могу, это успешная конфигурация или нет:

Setting up a MinGW/Qt only environment...
-- QTDIR set to F:\Qt\qt
-- PATH set to F:\Qt\qt\bin
-- Adding F:\Qt\bin to PATH
-- Adding F:\WINDOWS\System32 to PATH
-- QMAKESPEC set to win32-g++

а может вот эта команда не верна F:\Documents and Settings\Admin>F:\Qt\bin\qtenv.bat configure -openssl-linked

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)