Это правильный способ установить протокол SSL с QWebPage?
Я работал с SSL в Qt, где мне нужно установить определенный протокол (вместо стандартных "безопасных протоколов"). Похоже, это работает:
QSslConfiguration config = QSslConfiguration::defaultConfiguration();
config.setProtocol(QSsl::TlsV1_0);
QSslConfiguration::setDefaultConfiguration(config);
Но мне неудобно устанавливать протокол глобальным образом, как это, вместо того, чтобы устанавливать его на QWebPage
или же QWebView
или что-то. Я упускаю что-то очевидное или это действительно лучший способ сделать это? Я знаю, что могу установить его на сокете SSL, но я использую QtWebKit и не имею доступа к отдельным сокетам.
2 ответа
Я нашел способ сделать это, чтобы расширить QNetworkAccessManager
и установите протокол в createRequest
:
class NetworkAccessManager : public QNetworkAccessManager
{
Q_OBJECT
public:
explicit NetworkAccessManager(QObject *parent = 0);
protected:
virtual QNetworkReply * createRequest(Operation operation, const QNetworkRequest & request, QIODevice * outgoingData = 0) {
// I have no idea why request is const, but I need to change it
QNetworkRequest notConstRequest = request;
QSslConfiguration conf = notConstRequest.sslConfiguration();
conf.setProtocol(QSsl::TlsV1_0);
notConstRequest.setSslConfiguration(conf);
return QNetworkAccessManager::createRequest(operation, notConstRequest, outgoingData);
}
};
Тогда я могу установить его в моем QWebpage
с помощью setNetworkAccessManager
,
Вы можете найти это полезным: страница Https работает в Windows, но не в Linux, он использует ту же методологию (в нижней части страницы), что и вы для настройки протокола.
Я не смог найти много ресурсов, однако в документации Qt для Nokia прямо указано, что вы можете специально установить протокол для объекта QSslSocket. Соответствующий бит:
Обратите внимание, что изменения настроек в QSslConfiguration недостаточно для изменения настроек в связанном соединении SSL. Вы должны вызвать setSslConfiguration для измененного объекта QSslConfiguration для достижения этого. В следующем примере показано, как изменить протокол на TLSv1 в объекте QSslSocket:
QSslConfiguration config = sslSocket.sslConfiguration();
config.setProtocol(QSsl::TlsV1);
sslSocket.setSslConfiguration(config);
Так что да, лучший способ, вероятно, установить его для каждого объекта сокета, однако, если он недоступен, ваш метод также работает. Страница Nokia: QSslConfiguration