2011-12-02 17 views
11

Visual C++ 2008 SP1 ile Windows 7'de Qt SDK 1.1.4'ün temiz yüklemesi; Ben Qt Creator kullanıyorum. Bu kod neden bazı web sayfalarını yüklemiyor?QWebView/Qt WebKit bazı SSL sayfalarını açmayacaktır; yönlendirmelere izin verilmiyor mu?

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

Bazı URL'ler neden çalışmıyor, bazıları da çalışmıyor?

Sanırım google.com/www.google.com özellikle şunları söylüyor; google.com normal olarak www.google.com adresine yönlendirir. Ve gmail.com, accounts.google.com adresine yönlendiriyor. WebKit güvenli sayfaların yeniden yönlendirilmesine izin vermiyor mu? Öyleyse, bunu nasıl düzeltebilirim? Bu arada, Qt SDK 1.1.4, OpenSSL'yi içermekte gibi görünmektedir; C: \ QtSDK \ Desktop \ Qt \ 4.7.4 \ msvc2008 \ bin \ ssleay32.dll adresindeki varlığını fark ettim. Ayrıca, sayfasının bazı sayfalarının da işe yaramadığını görüyoruz.

DÜZENLEME: İki daha fazla URL: Yine

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

, diğer web tarayıcılarında bu çalışma cezası hem.

cevap

16

Muhtemelen bir yuvada kullanabileceğiniz SSL hataları alıyorsunuzdur. En iyi nihai çözüm olmasa da, tüm SSL hatalarını yok saymak için yuvayı kullanabilirsiniz.

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(); 
} 
Ben QWebView sınıflara göre bunu

bu böyle ayıklama çıktısını üretmelidir Koşu: son programında

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

, elbette düzgün SSL hataları işlemek için :)

+1

Ne dağınıklık? Burada sadece iki olasılık var gibi görünüyor: (1) HTTP spec yönlendirme veya diğer özel durumlarda kötü bir sertifikaya izin verir, ancak Qt bir hata vardır ve ilk etapta yeniden yönlendirmeyi reddeder ("çok sıkı"). Veya (2) Google yöneticileri bir hata yaptı, ancak İnternet Explorer, FireFox, Chrome ve diğer başlıca tarayıcıların ciddi bir güvenlik açığı olduğu için fark etmediler. Burada neler oluyor? –

+2

Eh, Qt ortalama web tarayıcısından daha az SSL hatalarına toleranslı görünüyor.Gerçekten önemsediğim sunucudaki web yöneticisinin ara sertifikaları sunucuya yüklemediği ortaya çıkıyor: http://www.sslshopper.com/ssl-certificate-not-trusted-error.html (son seçeneğe bakın). –

+0

Ayrıca bu hataları ui'de görüntülemek için '' 'example/network/securesocketclient''' ile birleştirmek de mümkündür. –

0

Ben genellikle "Arnold Spence" ın çözümü kullanmak isteyecektir ama Bazen bu işe yaramaz. bu durumda

sadece biz tüm uygulama için yapılandırma değişmiş İşte bu

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

gibi varsayılan SSL yapılandırmasını değiştirmek.

Ben de sslErrors sinyalini tutmanızı öneririm ..