2

我一直在 Qt 中使用 SSL,我需要设置一个特定的协议(而不是默认的“安全协议”)。看起来像这样有效:

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

QWebPage但是像这样以全局方式设置协议,而不是在orQWebView或其他东西上设置它让我感到不舒服。我是否遗漏了一些明显的东西,或者这真的是最好的方法吗?我知道我可以在 SSL 套接字上设置它,但我使用的是 QtWebKit,并且无法访问各个套接字。

4

2 回答 2

3

我发现这样做的方法是扩展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);
    }
};

然后我可以在我的QWebpageusing中设置它setNetworkAccessManager

于 2012-08-29T21:49:42.407 回答
2

您可能会发现这很有帮助:Https page works in Windows but not in Linux,他使用与设置协议相同的方法(靠近页面底部)。

我找不到很多资源,但是诺基亚的 Qt 文档明确指出您可以专门在 QSslSocket 对象上设置协议。相关位:

请注意,更改 QSslConfiguration 中的设置并不足以更改相关 SSL 连接中的设置。您必须在修改后的 QSslConfiguration 对象上调用 setSslConfiguration 才能实现此目的。以下示例说明了如何在 QSslSocket 对象中将协议更改为 TLSv1:

QSslConfiguration config = sslSocket.sslConfiguration();
config.setProtocol(QSsl::TlsV1);
sslSocket.setSslConfiguration(config);

所以是的,最好的方法可能是在每个套接字对象的基础上设置它,但是如果这不可用,您的方法也可以工作。诺基亚页面:QSslConfiguration

于 2012-08-28T16:04:30.070 回答