【问题标题】:How do I force QWebView to use SSLv3?如何强制 QWebView 使用 SSLv3?
【发布时间】:2012-08-25 22:13:22
【问题描述】:

有一个不支持 SSLv2 HELO 的 Web 服务器,因此我必须强制 QWebView 执行 SSLv3 HELO。不幸的是,以下方法不起作用:

QList ciphers = QSslSocket::supportedCiphers();
for (int i = ciphers.count() - 1; i >= 0; i--){
    QSslCipher cipher = ciphers.at(i);
    QSsl::SslProtocol protocol = cipher.protocol();
    if (protocol == QSsl::SslV2){
        ciphers.removeAt(i);
    }
}
QSslSocket::setDefaultCiphers(ciphers);

【问题讨论】:

    标签: qt ssl sslv3


    【解决方案1】:

    通过覆盖 QNetworkAccessManager 的 createRequest 虚函数,您可以强制它使用特定的 ssl 协议:

    MyNetworkAccessManager::MyNetworkAccessManager(
                   QNetworkAccessManager *oldManager, QObject *parent /*= 0*/)
        : QNetworkAccessManager(parent)
    {
        setCache(oldManager->cache());
        setCookieJar(oldManager->cookieJar());
        setProxy(oldManager->proxy());
        setProxyFactory(oldManager->proxyFactory());
    }
    
    
    QNetworkReply* MyNetworkAccessManager::createRequest(
             QNetworkAccessManager::Operation op, const QNetworkRequest &req, 
             QIODevice *device)
    {
        QSslConfiguration sslConfig = req.sslConfiguration();
        sslConfig.setProtocol(QSsl::SslV3);
        req.setSslConfiguration(sslConfig);
        return QNetworkAccessManager::createRequest(op, req, outgoingData);
    }
    
    
    view = new QWebView(this);
    QNetworkAccessManager *oldManager = view->page()->networkAccessManager();
    MyNetworkAccessManager *newManager = new MyNetworkAccessManager(oldManager, this);
    view->page()->setNetworkAccessManager(newManager);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-27
      • 1970-01-01
      • 1970-01-01
      • 2014-06-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多