2011-12-02 17 views
11

使用Visual C++ 2008 SP1在Windows 7上全新安裝Qt SDK 1.1.4;我正在使用Qt Creator。爲什麼此代碼不加載某些網頁?QWebView/Qt WebKit不會打開一些SSL頁面;重定向不允許?

#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(); 
} 

爲什麼一些URL不起作用,其他人呢?

我認爲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 

再次,兩者的其他網絡瀏覽器,這些做工精細。

回答

16

您可能會遇到可在插槽中處理的SSL錯誤。雖然不是最好的最終解決方案,但您可以使用插槽忽略所有SSL錯誤。

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 

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(); 
} 

的main.cpp」

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

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    WebView w; 
    w.show(); 
    return a.exec(); 
} 
我通過繼承 QWebView這樣做

運行這應該產生的調試輸出是這樣的:

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" 
... 

在你的最終方案,你當然要正確處理SSL錯誤:)

+1

什麼混亂?似乎這裏只有兩種可能:(1)HTTP規範允許在重定向或其他特殊情況下使用錯誤的證書,但Qt有一個錯誤,並且首先拒絕訪問重定向(它「太嚴格」了)。或者(2)谷歌管理員犯了一個錯誤,但沒有注意到,因爲Internet Explorer,FireFox,Chrome和其他主流瀏覽器存在嚴重的安全漏洞。這裏發生了什麼? –

+2

好吧,似乎Qt比普通的Web瀏覽器更不容忍SSL錯誤。事實證明,我真正關心的服務器上的網站管理員沒有在服務器上安裝中間證書:http://www.sslshopper.com/ssl-certificate-not-trusted-error.html(請參見上一個選項)。 –

+0

也可以將它與'examples/network/securesocketclient''結合在一起顯示這些錯誤。 –

0

我通常用「斯彭斯阿諾德」 S解決方案,但有時候不行。

在這種情況下

只是改變默認的SSL配置這樣

QSslConfiguration sslconf = QSslConfiguration::defaultConfiguration(); 
QList<QSslCertificate> cert_list = sslconf.caCertificates(); 
QList<QSslCertificate> cert_new = QSslCertificate::fromData("CaCertificates"); 
cert_list += cert_new; 

sslconf.setCaCertificates(cert_list); 
sslconf.setProtocol(QSsl::AnyProtocol); 
QSslConfiguration::setDefaultConfiguration(sslconf); 

在這裏,我們改變了配置整個應用程序。

我推薦你也處理sslErrors信號..