Search code examples
qtsslqtwebkit

Is this the right way to set the SSL protocol with QWebPage?


I've been working with SSL in Qt, where I need to set a specific protocol (instead of the default "secure protocols"). It looks like this works:

QSslConfiguration config = QSslConfiguration::defaultConfiguration();
config.setProtocol(QSsl::TlsV1_0);
QSslConfiguration::setDefaultConfiguration(config);

But it makes me uncomfortable to set the protocol in a global way like this, instead of setting it on the QWebPage or QWebView or something. Am I missing something obvious or is this really the best way to do this? I know I can set it on an SSL socket, but I'm using QtWebKit, and don't have access to the individual sockets.


Solution

  • The way I've found to do this is to extend QNetworkAccessManager and set the protocol in 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);
        }
    };
    

    Then I can set it in my QWebpage using setNetworkAccessManager.