problema nel fare certificati radice personalizzata per SSL utilizzando QT?
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?
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"