我一直在使用Qt中的SSL,我需要设置一个特定的协议(而不是默认的“安全协议”)。它看起来像是有效的:
QSslConfiguration config = QSslConfiguration::defaultConfiguration();
config.setProtocol(QSsl::TlsV1_0);
QSslConfiguration::setDefaultConfiguration(config);
但是让我以这样的全局方式设置协议让我感到不舒服,而不是在QWebPage
或QWebView
或其他东西上设置协议。我错过了一些明显的东西,或者这真的是最好的方法吗?我知道我可以在SSL套接字上设置它,但我使用的是QtWebKit,并且无法访问各个套接字。
答案 0 :(得分: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);
}
};
然后我可以使用setNetworkAccessManager
在QWebpage
中设置它。
答案 1 :(得分: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