2011-12-02 20 views
11

Cài đặt sạch Qt SDK 1.1.4 trên Windows 7 bằng Visual C++ 2008 SP1; Tôi đang sử dụng Qt Creator. Tại sao mã này không tải một số trang web?QWebView/Qt WebKit sẽ không mở một số trang SSL; chuyển hướng không được phép?

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

Tại sao một số URL không làm việc, và những người khác làm gì?

Tôi nghĩ google.com/www.google.com đặc biệt nói; google.com thường chuyển hướng đến www.google.com. Và gmail.com đang chuyển hướng đến accounts.google.com. WebKit có cho phép các trang bảo mật chuyển hướng không? Nếu vậy, cách khắc phục điều đó?

Nhân tiện, Qt SDK 1.1.4 dường như bao gồm OpenSSL; Tôi nhận thấy sự hiện diện của nó tại C: \ QtSDK \ Desktop \ Qt \ 4.7.4 \ msvc2008 \ bin \ ssleay32.dll. Cũng lưu ý rằng một số trang dường như hoạt động, không chỉ các trang khác.

EDIT: Hai hơn URL:

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

Một lần nữa, cả hai làm việc tốt trong các trình duyệt web khác.

Trả lời

16

Có thể bạn đang gặp lỗi SSL mà bạn có thể xử lý trong một vị trí. Mặc dù không phải là giải pháp cuối cùng tốt nhất, bạn có thể sử dụng các khe để bỏ qua tất cả các lỗi SSL. Tôi đã làm điều này bằng cách subclassing 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(); 
} 

Chạy này nên sản xuất sản lượng debug như thế này:

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

Trong chương trình cuối cùng của bạn, bạn sẽ đương nhiên muốn xử lý lỗi SSL đúng :)

+1

Điều gì gây rối? Có vẻ như chỉ có hai khả năng ở đây: (1) Đặc tả HTTP cho phép chứng chỉ xấu khi chuyển hướng hoặc các trường hợp đặc biệt khác, nhưng Qt có lỗi và từ chối truy cập chuyển hướng ngay từ đầu (nó quá "nghiêm ngặt"). Hoặc (2) quản trị viên Google đã mắc lỗi nhưng không nhận thấy vì Internet Explorer, FireFox, Chrome và các trình duyệt chính khác có lỗ hổng bảo mật nghiêm trọng. Những gì đang xảy ra ở đây? –

+2

Vâng, có vẻ như Qt ít chịu lỗi SSL hơn so với trình duyệt web trung bình.Nó chỉ ra rằng các webmaster trên máy chủ tôi thực sự quan tâm về đã không được cài đặt chứng chỉ trung gian trên máy chủ: http://www.sslshopper.com/ssl-certificate-not-trusted-error.html (xem tùy chọn cuối cùng). –

+0

Cũng có thể kết hợp điều này với '' 'example/network/securesocketclient''' để hiển thị các lỗi này trong ui. –

0

Tôi thường sử dụng "Arnold Spence" s giải pháp nhưng đôi khi điều đó sẽ không hoạt động.

trong trường hợp đó chỉ cần thay đổi cấu hình SSL mặc định như thế này

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

Ở đây chúng ta thay đổi cấu hình cho toàn bộ ứng dụng.

Tôi khuyên bạn nên xử lý tín hiệu sslErrors quá ..

Các vấn đề liên quan