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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО]Подружить WebKit с самопальными сертификатами.  (Прочитано 8850 раз)
RedDog
Гость
« : Март 11, 2013, 16:48 »

Поднял вебсервер nginx на https, подсунул ему самопальные сертификаты.
Сервер настроил на проксирование вебсокета, т.е. запрос вида
wss://hostName/websocket он проксирует на localhost:8086
Так же запустил Qt вебсокет сервер (рядом с nginx).
Из фаерфокса соединяюсь с nginx-ом выдает запрос мол "сертификат левый, дай добро на его использование".
Дал "добро" и все нормально заработало, т.е. идет по https, далее вебсокет проксируется на мой Qt сервер.

Делаю это все через QWebView без всякого шаманства с сертификатами - не соединятеся.
Делаю шаманство в виде игнорирования Ssl ошибок:
Код:
connect(ui->webView->page()->networkAccessManager(),
            SIGNAL(sslErrors(QNetworkReply*, const QList<QSslError> & )),
            this, SLOT(sslErrorHandler(QNetworkReply*, const QList<QSslError> & )));
void MainWindow::sslErrorHandler(QNetworkReply* netwreply, const QList<QSslError> & )
{
  netwreply->ignoreSslErrors();
}
Страницу так грузит, но по вебсокету не соединятся, т.е. nginx отказывается проксировать это шаманство.
Как можно побороть эти "левые" сертификаты?
Ошибки Ssl:
Цитировать
"The host name did not match any of the valid hosts for this certificate"
"The certificate is self-signed, and untrusted"
« Последнее редактирование: Апрель 12, 2013, 09:05 от RedDog » Записан
lesav
Частый гость
***
Offline Offline

Сообщений: 235


qnx.org.ru


Просмотр профиля WWW
« Ответ #1 : Март 11, 2013, 17:21 »

Получаем бесплатный SSL сертификат
Записан

RedDog
Гость
« Ответ #2 : Март 11, 2013, 17:57 »

мне не это совсем нужно, тем более домена нету в принципе.
Записан
lesav
Частый гость
***
Offline Offline

Сообщений: 235


qnx.org.ru


Просмотр профиля WWW
« Ответ #3 : Март 12, 2013, 10:45 »

http://www.forum.crossplatform.ru/lofiversion/index.php/t6177.html
ЭнжинИксу видимо все равно какие у него сертификаты, он коммутатор.
А вот QSslSocket-у и QNetworkReply не все равно.  Может так заработает ?

Код
C++ (Qt)
bool m_bIgnoreSelfSignSsl = true;
void MainWindow::sslErrorHandler(QNetworkReply* netwreply, const QList<QSslError> &errors){
 QList<QSslError> ignoreErrors;
 for(int i = 0; i < errors.size(); i++) {
   switch(errors[i].error()) {
   case QSslError::SelfSignedCertificate:
   case QSslError::HostNameMismatch:
     if(m_bIgnoreSelfSignSsl)    ignoreErrors.append(errors[i]);
     else
       qDebug(QString("err certificate %1: %2")
             .arg(errors[i].error())
             .arg(errors[i].errorString())
       );
   break;
   default:    break;
   }
 }
 netwreply->ignoreSslErrors(ignoreErrors);
}
Записан

RedDog
Гость
« Ответ #4 : Март 12, 2013, 12:38 »

Не помгло, да и в принципе этот код делает тоже самое. что и вызов сигнала ignoreSslErrors().
Записан
RedDog
Гость
« Ответ #5 : Март 14, 2013, 08:25 »

Потестировал QWebView на websocket.org, а так же потестил на своем серваке по обычному HTTP.
Все везде работает, в 1-м случае работает с нормальными сертификатами, во 2-м случае они и вовсе не нужны.
Пришел к выводу, что скриптовый движок QWebView не получает сигнала ignoreSslErrors() от самого QWebView и наоборот, сигнал от скрипта о наличии SSL ошибок не доходит до QWebView.
Где и как это можно пофиксить?
Записан
RedDog
Гость
« Ответ #6 : Апрель 01, 2013, 15:52 »

Сделал СА сертификаты, на основе них сделал сертификаты пользователя.
Сделал свой NetworkAccessManager с поздгузкой клиентских сертификатов:
Код
C++ (Qt)
QNetworkReply* QNetworkAccessManagerEx::createRequest(Operation op, const QNetworkRequest & req, QIODevice * outgoingData)
{
   QNetworkRequest myReq = req;
   QSslConfiguration conf = req.sslConfiguration();
   conf.setPeerVerifyMode(QSslSocket::QueryPeer);
   QFile certFile("client01.crt");
   certFile.open(QIODevice::ReadOnly);
   conf.setLocalCertificate(QSslCertificate(certFile.readAll()));
   QFile keyFile("client01.key");
   keyFile.open(QIODevice::ReadOnly);
   QSslKey key(keyFile.readAll(), QSsl::Rsa);
 
   conf.setPrivateKey(key);
   certFile.close();
   myReq.setSslConfiguration(conf);
   QNetworkReply *repl = QNetworkAccessManager::createRequest( op, myReq, outgoingData );
   return repl;
}
Теперь страницу грузит без ошибок SSL.
Но! При выполнении скрипта на создание вебсокета в мой QNetworkAccessManagerEx не попадает.
Однако, если тестить на websocket.org, то там и соединяется по секурному вебсокету и попадает в мой QNetworkAccessManagerEx при соединении.
В чем может быть ошибка?
Записан
RedDog
Гость
« Ответ #7 : Апрель 12, 2013, 09:04 »

Решение как всегда оказалось простым и лежало на поверхности:
Надо статически, до использования подключения, загрузить свой СА сертификат через
Код
C
void QSslSocket::addDefaultCaCertificate(const QSslCertificate & certificate) [static]
При чем, насколько я понимаю, ВебКит не использует корневые сертификаты, установленные в системе, а собран с ограниченным набором своих СА, потому что добавление в OpenSSL своего СА, эффекта не дает, работает только принудительная загрузка в приложении.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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