QWebView/Qt WebKit不会打开一些SSL页面; 不允许重定向?

Jam*_*ton 12 c++ ssl qt qt4 qtwebkit

使用Visual C++ 2008 SP1在Windows 7上干净安装Qt SDK 1.1.4; 我正在使用Qt Creator.为什么这段代码没有加载某些网页?

#include <QtGui/QApplication>
#include <QtWebKit/QWebView>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QWebView b;
    b.load(QUrl("https://gmail.com")); // doesn't work
    //b.load(QUrl("https://accounts.google.com")); // works
    //b.load(QUrl("https://google.com")); // doesn't work
    //b.load(QUrl("https://www.google.com")); // works
    b.show();

    return a.exec();
}
Run Code Online (Sandbox Code Playgroud)

为什么有些网址不起作用,有些网址不起作用?

我认为google.com/www.google.com特别有说服力; google.com通常会重定向到www.google.com.gmail.com正在重定向到accounts.google.com.WebKit不允许安全页面重定向吗?如果是这样,如何解决?

顺便说一下,Qt SDK 1.1.4似乎包含了OpenSSL; 我注意到它出现在C:\ QtSDK\Desktop\Qt\4.7.4\msvc2008\bin\ssleay32.dll.还要注意一些页面似乎有效,而不是其他页面.

编辑: 另外两个网址:

b.load(QUrl("https://support.motionview3d.com/help/_media/images/directory.png")); // doesn't work
b.load(QUrl("https://mail.google.com")); // works
Run Code Online (Sandbox Code Playgroud)

同样,这两种方法在其他Web浏览器中都可以正常工作.

Arn*_*nce 18

您可能会收到可以在插槽中处理的SSL错误.虽然不是最佳的最终解决方案,但您可以使用该插槽忽略所有SSL错误.我通过子类化做到了这一点 QWebView:

qwebview.h:

#ifndef WEBVIEW_H
#define WEBVIEW_H

#include <QWebView>

class WebView : public QWebView
{
    Q_OBJECT

    public:
        WebView(QWidget *parent = 0);
    private slots:
        void handleSslErrors(QNetworkReply* reply, const QList<QSslError> &errors);
};

#endif // WEBVIEW_H
Run Code Online (Sandbox Code Playgroud)

qwebview.cpp:

#include "webview.h"
#include <QNetworkReply>
#include <QtDebug>
#include <QSslError>

WebView::WebView(QWidget *parent) :
    QWebView(parent)
{
    load(QUrl("https://gmail.com"));

    connect(page()->networkAccessManager(),
            SIGNAL(sslErrors(QNetworkReply*, const QList<QSslError> & )),
            this,
            SLOT(handleSslErrors(QNetworkReply*, const QList<QSslError> & )));  
}

void WebView::handleSslErrors(QNetworkReply* reply, const QList<QSslError> &errors)
{
    qDebug() << "handleSslErrors: ";
    foreach (QSslError e, errors)
    {
        qDebug() << "ssl error: " << e;
    }

    reply->ignoreSslErrors();
}
Run Code Online (Sandbox Code Playgroud)

的main.cpp"

#include <QApplication>
#include "WebView.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    WebView w;
    w.show();
    return a.exec();
}
Run Code Online (Sandbox Code Playgroud)

运行它应该产生这样的调试输出:

handleSslErrors:  
ssl error:  "The host name did not match any of the valid hosts for this certificate" 
ssl error:  "No error" 
ssl error:  "No error" 
...
Run Code Online (Sandbox Code Playgroud)

在您的最终程序中,您当然希望正确处理SSL错误:)

  • 好吧,似乎Qt对SSL错误的容忍程度低于普通网络浏览器.事实证明,我真正关心的服务器上的网站管理员没有在服务器上安装中间证书:http://www.sslshopper.com/ssl-certificate-not-trusted-error.html(参见最后一个选项). (2认同)