Форум программистов, компьютерный форум, киберфорум
oxotnik
Войти
Регистрация
Восстановить пароль

QWebKit & вебсокеты, мои страдания.

Запись от oxotnik размещена 12.04.2013 в 09:58
Показов 4707 Комментарии 0
Метки qtwebkit, websocket

Уже приличное время продвигается в массы такая технология как вебсокеты, т.е. "поверх" http соединения открывается отдельный сокет, который держит постоянное соединение с вебсервером, в результате можем иметь динамичную вебстраницу, без всяких костылей типа флаш-плейера или ежесекундного запроса джаваскрипта.
Понадобилось мне сделать свой веб-браузер (который в дальнейшем заменит оконный менеджер в ОС), с учетом этой технологии.
Сама связка QWebKit & вебсокеты работает нормально. Еще бы она не нормально работала, ибо вебкит юзается в большей части нынешних браузеров.
Но, понадобилось установить защищенное соединение между клиентом и сервером, то бишь https. Откуда и начались все проблемы.
Весь инет просто кишит советами, что мол, при использовании самоподписных сертификатов, надо вызывать ignoreSslErrors().
Этот вызов в принципе помогает, но исключительно только на загрузку страницы.
Далее, попытка соединения по вебсокету не удавалась.
Пошел дальше:
- создал свой центр сертификации, им создал и подписал серверные и клиентские сертификаты
- сабклассил QNetworkAccessManager и подсунул в формирование запроса свои сертификаты:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
QNetworkReply* QNetworkAccessManagerEx::createRequest(Operation op, const QNetworkRequest & req, QIODevice * outgoingData)
{
    QNetworkRequest myReq = req;
    QSslConfiguration conf = req.sslConfiguration();
    QFile keyFile("client.key");
    keyFile.open(QIODevice::ReadOnly);
    QSslKey key(keyFile.readAll(), QSsl::Rsa);
    conf.setPrivateKey(key);
    keyFile.close();
    QFile certFile("client.crt");
    certFile.open(QIODevice::ReadOnly);
    QSslCertificate localCert = QSslCertificate(certFile.readAll());
    if (!localCert.isNull())
        conf.setLocalCertificate(localCert);
    certFile.close();
 
    QList<QSslCertificate>caCerts = conf.caCertificates();
    QFile caCertFile("ca.crt");
    caCertFile.open(QIODevice::ReadOnly);
    QSslCertificate certCA(caCertFile.readAll());
    if (!certCA.isNull())
        caCerts.append(certCA);
    caCertFile.close();
    conf.setCaCertificates(caCerts);
    myReq.setSslConfiguration(conf);
    QNetworkReply *repl = QNetworkAccessManager::createRequest( op, myReq, outgoingData );
    return repl;
}
и опять не помогло, но теперь хотя бы QWebView не выдает SSL ошибок, т.е. сертификаты считаются годными.
По совету поддержки от Qt заглянул в сорцы вебкита в файлик SocketStreamHandleQt.cpp, и что же видим:
(Важно!) Вебсокеты в QWebKit реализованы отдельным механизмом, через отдельный сокет, и не используют при запросе на сервер QNetworkAccessManager.
Далее, следуя этому принципу, установил в систему свой СА сертификат (чтобы вебсокет брал системные), но и тут ждала засада, потому что, он берет корневые сертификаты совсем не из системы (почему то), а уже собран с поддержкой основных сертификационных центров.
По такому же принципу работает и хром и фаерфокс - у них свой независимый список СА. Однако указанным браузерам можно загрузить свой сертификат, который они будут считать доверенным.
Сложив в уме все вышеизложенное, пришел к выводу, что надо динамически загружать СА сертификат в свое приложение.
Полазил по хелпу и нашел статический метод
C++
1
static QSslSocket::addDefaultCaCertificate(QSslCerticate&);
которым, собственно, и была решена проблема.
Итак, подытоживая вышесказанное:
При старте приложения, либо в другом месте, но до момента, когда необходимо будет сединяться по вебсокету, установить в свое приложение СА сертификат:
C++
1
2
3
4
5
6
    QFile caCertFile("ca.crt");
    caCertFile.open(QIODevice::ReadOnly);
    QSslCertificate certCA(caCertFile.readAll());
    if (!certCA.isNull())
        QSslSocket::addDefaultCaCertificate(certCA);
    caCertFile.close();
Далее он статически запоминается в недрах QSsl и любой запрос на защищенное соединение будет использовать в числе прочих, и наш сертификат.
Метки qtwebkit, websocket
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии
 
Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru