2011-12-02 7 views
11

Visual C++ 2008 SP1でWindows 7にQt SDK 1.1.4をクリーンインストールします。私はQt Creatorを使用しています。なぜこのコードはいくつかのWebページを読み込まないのですか?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にその存在を気づいた。また、一部のページが動作するように見えます。

EDIT:つ以上のURL:

再び
b.load(QUrl("https://support.motionview3d.com/help/_media/images/directory.png")); // doesn't work 
b.load(QUrl("https://mail.google.com")); // works 

、他のWebブラウザでこれらの作業罰金の両方。

答えて

16

スロットで処理できる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 

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

がこのようなデバッグ出力を生成する必要があり実行:私は通常、「アーノルド・スペンス」のソリューションを使用して、最終的なプログラムで

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

何が混乱していますか?ここには2つの可能性があるようです:(1)HTTP仕様では、リダイレクトやその他の特別なケースで不正な証明書が許可されますが、Qtにバグがあり、最初はリダイレクトへのアクセスを拒否しています。または(2)Google管理者は間違いを犯しましたが、Internet Explorer、FireFox、Chrome、その他の主要ブラウザに重大なセキュリティホールがあるため、気付かなかった。何が起きてる? –

+2

Qtは平均的なWebブラウザよりもSSLエラーの許容度が低いと思われます。私が本当に気にしているサーバーのWebマスターは、サーバーに中間証明書をインストールしていないことが判明しました。http://www.sslshopper.com/ssl-certificate-not-trusted-error.html(最後のオプションを参照) –

+0

これを '' examples/network/securesocketclient'''と組み合わせて、これらのエラーをuiに表示することもできます。 –

0

をが、時にはそれは動作しません。その場合の

はちょうどここでは、この

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

のように、デフォルトのSSL設定を変更する我々はアプリケーション全体の設定を変更します。

sslErrors信号も処理することをおすすめします。

関連する問題