Domanda

sto sviluppando il mio browser personalizzato in Qt utilizzando QWebView e Sto cercando di fare il mio negozio radice del CERT dei certificati affidabili che sono presi dal progetto Mozilla.

Ho usato QSslSocket :: setDefaultCaCertificates () per sostituire i certificati di default. Ma io non sono in grado di caricare https://www.gmail.com , dove come in Mozilla funziona.

ho impostato tutti i certificati di origine necessari per Gmail al mio deposito.

Qualcuno mi guida?

È stato utile?

Soluzione

La ragione per cui non riesce a connettersi è perché il certificato SSL (con 2F:DF:BC:F6:AE:91:52:6D:0F:9A:A3:DF:40:34:3E:9A seriale) presentato a voi quando ci si connette a www.gmail.com viene rilasciato per un diverso dominio - www.google.com. Questo non ha nulla a che fare con certificati radice CA perché nessun certificato principale CA è necessaria per confrontare Soggetto campo CN del cert con l'host che si sta tentando di connettersi. È possibile ignorare questo e altri errori SSL chiamando
void QNetworkReply::ignoreSslErrors () [virtual slot]
Per evitare questo errore si può collegare direttamente al https://mail.google.com , che è il dominio che si sta comportando reindirizzato a quando si tenta di connettersi a https://www.gmail.com

Di seguito è riportato un esempio di lavoro che vi mostrerà gli errori SSL esatta e gli errori di livello QNAM. Entrambe le linee B1 o B2 linea devono essere attivi contemporaneamente. Puoi lasciare un commento, linea A, se volete vedere cosa succede con la radice CA di certificati di default (di sistema). Ci sono due certs utilizzati da questo codice; cert di CA con 30:00:00:02 seriale deve essere collocato in un file chiamato ThawteSGCCA.crt e cert di CA con 70:BA:E4:1D:10:D9:29:34:B6:38:CA:7B:03:CC:BA:BF seriale deve essere collocato in un file chiamato BuiltinObjectToken-VerisignClass3PublicPrimaryCertificationAuthority.crt.

#include <QtGui/QApplication>
#include <QtCore/QDebug>
#include <QtCore/QList>
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkRequest>
#include <QtNetwork/QNetworkReply>
#include <QtNetwork/QSslConfiguration>
#include <QtNetwork/QSslSocket>
#include <QtNetwork/QSslError>
#include <QtWebKit/QWebFrame>
#include <QtWebKit/QWebPage>



class Handler : public QObject{
    Q_OBJECT

public slots:

    void slotLoadFinished(bool ok) {
        if (ok) {
            qDebug() << "Page size: " << static_cast<QWebPage*>(sender())->mainFrame()->toHtml().size();
        }
    }

    void slotFinished(QNetworkReply * reply) {
        if (reply->error() == QNetworkReply::NoError) {
            qDebug() << "connected to " << reply->url();
            qDebug() << "HTTP status: " << reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();

        } else {
            qDebug() << "error while connecting to " << reply->url();
            qDebug() << "error code: " << reply->error();
            qDebug() << "error string: " << reply->errorString();
        }
    }

    void slotSslErrors(QNetworkReply * reply, QList<QSslError> const & errors) {
        qDebug() << "SSL errors: " << errors;
        qDebug() << "peer's certificate: "
                 << reply->sslConfiguration().peerCertificate();
    }

};


int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    Handler handler;

    // CA certs for:
    // 1. cert with Subject.CN == mail.google.com cert with serial 1f:19:f6:de:35:dd:63:a1:42:91:8a:d5:2c:c0:ab:12
    // 2. cert with Subject.CN == www.google.com cert with serial 2F:DF:BC:F6:AE:91:52:6D:0F:9A:A3:DF:40:34:3E:9A
    QList<QSslCertificate> CAcerts =
            // serial 30:00:00:02
            QSslCertificate::fromPath("ThawteSGCCA.crt") +
            // serial 70:BA:E4:1D:10:D9:29:34:B6:38:CA:7B:03:CC:BA:BF
            QSslCertificate::fromPath("BuiltinObjectToken-VerisignClass3PublicPrimaryCertificationAuthority.crt");

    qDebug() << "root CA certificates:\n"
             << CAcerts
             << "\n";
    QSslSocket::setDefaultCaCertificates(CAcerts); // line A

    QWebPage page;
    // OK because cert with serial 1f:19:f6:de:35:dd:63:a1:42:91:8a:d5:2c:c0:ab:12 is for host mail.google.com
//  page.mainFrame()->load(QUrl("https://mail.google.com")); // line B1
    // SSL ERROR "The host name did not match any of the valid hosts for this certificate"
    // because cert with serial 1f:19:f6:de:35:dd:63:a1:42:91:8a:d5:2c:c0:ab:12 is NOT for www.gmail.com
    page.mainFrame()->load(QUrl("https://www.gmail.com")); // line B2

    QObject::connect(page.networkAccessManager(), SIGNAL(finished(QNetworkReply*)), &handler, SLOT(slotFinished(QNetworkReply*)));
    QObject::connect(page.networkAccessManager(), SIGNAL(sslErrors(QNetworkReply*,QList<QSslError>)), &handler, SLOT(slotSslErrors(QNetworkReply*,QList<QSslError>)));
    QObject::connect(&page, SIGNAL(loadFinished(bool)), &handler, SLOT(slotLoadFinished(bool)));

    return app.exec();
}

#include "main.moc"
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top