Это правильный способ установить протокол 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

Другие вопросы по тегам