Russian Qt Forum
Ноябрь 24, 2024, 06:44 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: ignoreSslErrors() не работает  (Прочитано 4823 раз)
Reklats
Гость
« : Февраль 18, 2011, 23:10 »

Всем привет!

Встала довольно тривиальная задача: авторизоваться Basic авторизацией по ssl. Покурив пример из examples\network\http не стал изобретать велосипед и просто немного изменил этот пример. Да вот только он не работает с нужным мне сайтом.
Сделал всё как написано в доках: в слот, который соединён с сигналом sslError() вставляю ignoreSslErrors().

Код
C++ (Qt)
 
void myClass::slotSslErrors(QNetworkReply*,const QList<QSslError> &errors){
 
   foreach ( const QSslError &e, errors) {
       qDebug() << "SSL Error:" << e.errorString();
   }
   reply->ignoreSslErrors();
}
 
 

В консоли высвечиваются 2 ошибки сертификата "The host name did not match any of the valid hosts for this certificate" и "The certificate is self-signed, and untrusted". А потом сразу шлётся сигнал finished() и вываливается ошибка "SSL handshake failed". Ни до какой авторизации дело не доходит.

Перелопатил весь этот форум, у гугла спрашивал - бестолку. Ничего не помогает. Что я делаю не так?

upd: После некоторых манипуляций выяснилось, что таки ошибки игнорируются, как то не так:
шлю запрос, вызывается slotSslErrors(), потом вызывается слот авторизации, потом снова slotSslErrors() и так по кругу. Логин и пароль верные.
« Последнее редактирование: Февраль 19, 2011, 00:32 от Reklats » Записан
Reklats
Гость
« Ответ #1 : Февраль 20, 2011, 18:41 »

Думаю, что надо просто запретить проверку сертификата - установить QSslSocket::VerifyNone.
Если пишу так:

Код
C++ (Qt)
void MyClass::startRequest(QUrl *url)
{
   qDebug() << "startRequest :" << trUtf8("Shlju zapros");
   qDebug() << "startRequest : 1)" << reply->sslConfiguration().peerVerifyMode();
 
   QSslConfiguration sslConfiguration = reply->sslConfiguration();
   sslConfiguration.setPeerVerifyMode(QSslSocket::VerifyNone);
   reply->setSslConfiguration(sslConfiguration);
 
   reply = qnam.get(QNetworkRequest(*url));
   qDebug() << "startRequest : 2)" << reply->sslConfiguration().peerVerifyMode();
}
 

В консоль вываливается вот это:
Код:
slotDownloadButton : "Кнопка нажата" 
startRequest : "Шлю запрос"
Error -
RtlWerpReportException failed with status code :-1073741823. Will try to launch the process directly

Я в панике. В доках написано, что задавать конфиг SSL надо до запроса, а тут такое. Что делать?
Записан
Reklats
Гость
« Ответ #2 : Март 08, 2011, 19:06 »

Как оказалось, ssl не при чём. Не верная Basic авторизация. Нужно было в 1м запросе получить куки, а во 2м получить нужную страницу. При чём сигнал authenticationRequired(QNetworkReply*,QAuthenticator*) ловить не обязательно. Всё можно сделать гораздо компактнее - добавить заголовок Authorization:

Код
C++ (Qt)
request.setRawHeader("Authorization", "Basic " + QByteArray(QString("%1:%2").arg("name").arg("pas").toAscii()).toBase64());
 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.096 секунд. Запросов: 21.