Problem bei der Erstellung eines benutzerdefinierten Stammzertifikats für SSL mit QT?

StackOverflow https://stackoverflow.com/questions/4831739

  •  27-10-2019
  •  | 
  •  

Frage

Ich entwickle meinen benutzerdefinierten Browser in QT mit QWebView und versuche, mein eigenes Stammzertifikat vertrauenswürdiger Zertifikate zu erstellen, die aus dem Mozilla -Projekt stammen.

Ich habe QSSLSocket :: setDefaultCactificates () verwendet, um die Standardzertifikate zu überschreiben. Aber ich kann nicht laden https://www.gmail.com , wo wie in Mozilla es funktioniert.

Ich habe alle erforderlichen Root Certs für Google Mail in meinem Geschäft gesetzt.

Kann mich jemand führen?

War es hilfreich?

Lösung

Der Grund, warum Sie nicht eine Verbindung herstellen können, ist das SSL -Zertifikat (mit Serien 2F:DF:BC:F6:AE:91:52:6D:0F:9A:A3:DF:40:34:3E:9A) präsentiert, wenn Sie eine Verbindung zu www.gmail.com herstellen, wird für eine andere Domain ausgestellt - www.google.com. Dies hat nichts mit dem Root CA -Zertifikatspeicher zu tun, da kein Root CA -Zertifikat erforderlich ist, um das Thema CN von Cert mit dem Host zu vergleichen, mit dem Sie eine Verbindung herstellen möchten. Sie können diese und andere SSL -Fehler durch Anrufe ignorieren
void QNetworkReply::ignoreSslErrors () [virtual slot]
Um diesen Fehler zu vermeiden, können Sie direkt eine Verbindung herstellen https://mail.google.com In welcher Domäne, auf die Sie umgeleitet werden, wenn Sie versuchen, eine Verbindung herzustellen https://www.gmail.com

Im Folgenden finden Sie ein funktionierendes Beispiel, das Ihnen die genauen SSL -Fehler und QNAM -Ebenenfehler anzeigt. Entweder Zeile B1 oder Zeile B2 müssen gleichzeitig aktiv sein. Sie können die Zeile A Kommentar abgeben, wenn Sie sehen möchten, was mit dem Standard -CA -Zertifikatspeicher (System-) Root -CA -Zertifikat passiert. In diesem Code werden zwei Zertifikate verwendet. CAs Zertifikat mit Serien 30:00:00:02 sollte in eine Datei genannt werden ThawteSGCCA.crt und CAs Zertifikat mit Serien 70:BA:E4:1D:10:D9:29:34:B6:38:CA:7B:03:CC:BA:BF sollte in eine Datei genannt werden 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"
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top