problème dans la fabrication magasin de certificats racine personnalisée pour SSL à l'aide QT?

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

  •  27-10-2019
  •  | 
  •  

Question

Je développe mon navigateur personnalisé dans Qt en utilisant QWebView et Je suis en train de faire mon propre magasin de cert racine des certificats de confiance qui sont prises de projet mozilla.

J'ai utilisé QSslSocket :: setDefaultCaCertificates () pour remplacer les certificats par défaut. Mais je ne suis pas en mesure de charger https://www.gmail.com , où, comme dans mozilla cela fonctionne.

J'ai mis tous les certs root requises pour gmail à mon magasin.

Quelqu'un peut-il me guider?

Était-ce utile?

La solution

La raison pour laquelle vous ne pouvez pas connecter parce que le certificat SSL (avec 2F:DF:BC:F6:AE:91:52:6D:0F:9A:A3:DF:40:34:3E:9A série) présentée lorsque vous vous connectez à www.gmail.com est délivré pour un autre domaine - www.google.com. Cela n'a rien à voir avec le magasin de certificats de CA racine car aucun certificat de CA racine est nécessaire pour comparer le champ de cert Objet CN avec l'hôte que vous essayez de vous connecter. Vous pouvez ignorer cela et d'autres erreurs SSL en appelant
void QNetworkReply::ignoreSslErrors () [virtual slot]
Pour éviter cette erreur, vous pouvez vous connecter directement à https://mail.google.com qui est le domaine que vous êtes redirigé vers lorsque vous essayez de vous connecter à https://www.gmail.com

Ci-dessous un exemple de travail qui vous montrera les erreurs SSL exactes et les erreurs de niveau de QNAM. Soit la ligne B1 ou B2 ligne doivent être actifs en même temps. Vous pouvez commenter la ligne A si vous voulez voir ce qui se passe avec le magasin de certificat CA racine par défaut (système). Il y a deux certs utilisés par ce code; cert CA avec 30:00:00:02 série doit être placé dans un fichier appelé ThawteSGCCA.crt et cert CA avec 70:BA:E4:1D:10:D9:29:34:B6:38:CA:7B:03:CC:BA:BF série doit être placé dans un fichier appelé 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"
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top