Russian Qt Forum

Qt => Qt Script, QtWebKit => Тема начата: RedDog от Март 11, 2013, 16:48



Название: [РЕШЕНО]Подружить WebKit с самопальными сертификатами.
Отправлено: 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"


Название: Re: Подружить WebKit с самопальными сертификатами.
Отправлено: lesav от Март 11, 2013, 17:21
Получаем бесплатный SSL сертификат (http://habrahabr.ru/post/127643/)


Название: Re: Подружить WebKit с самопальными сертификатами.
Отправлено: RedDog от Март 11, 2013, 17:57
Получаем бесплатный SSL сертификат (http://habrahabr.ru/post/127643/)

мне не это совсем нужно, тем более домена нету в принципе.


Название: Re: Подружить WebKit с самопальными сертификатами.
Отправлено: lesav от Март 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);
}


Название: Re: Подружить WebKit с самопальными сертификатами.
Отправлено: RedDog от Март 12, 2013, 12:38
Не помгло, да и в принципе этот код делает тоже самое. что и вызов сигнала ignoreSslErrors().


Название: Re: Подружить WebKit с самопальными сертификатами.
Отправлено: RedDog от Март 14, 2013, 08:25
Потестировал QWebView на websocket.org, а так же потестил на своем серваке по обычному HTTP.
Все везде работает, в 1-м случае работает с нормальными сертификатами, во 2-м случае они и вовсе не нужны.
Пришел к выводу, что скриптовый движок QWebView не получает сигнала ignoreSslErrors() от самого QWebView и наоборот, сигнал от скрипта о наличии SSL ошибок не доходит до QWebView.
Где и как это можно пофиксить?


Название: Re: Подружить WebKit с самопальными сертификатами.
Отправлено: RedDog от Апрель 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 при соединении.
В чем может быть ошибка?


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