2017-03-14 2 views
1

La clé publique d'un certificat donné affichée par Windows lors de l'examen des détails du certificat dans Chrome diffère de celle renvoyée par Qt dans un emplacement connecté au signal chiffré.QSslCertificate comment obtenir la clé publique telle qu'affichée dans Windows

auto onEncrypt = [](QNetworkReply* rpl) { 
    auto cert = rpl->sslConfiguration().peerCertificate(); 
    auto publicKey = cert.publicKey(); 

    QString winHexKey = "3082010a0282010100d8..."; // as displayed in cert info of Chrome on Windows for the Public Key 
    auto windowsKey = QByteArray::fromHex(winHexKey.toUtf8()); 
    if (windowsKey == publicKey.toPem()) 
     std::cout << "PEM key matched\n"; 
    else if (windowsKey == publicKey.toDer()) 
     std::cout << "DER key matched\n"; 
    else if (winHexKey == publicKey.toPem().toHex()) 
     std::cout << "Hex PEM key matched\n"; 
    else if (winHexKey == publicKey.toDer().toHex()) 
     std::cout << "Hex DER key matched\n"; 
    else 
     std::cout << "No match!\n"; 
    std::cout << publicKey.toPem().toHex().toStdString() << '\n'; // 902 characters worth starting with 2d2d2d2d2d 
}; 
QNetworkAccessManager mgr; 
QObject::connect(&mgr, &QNetworkAccessManager::encrypted, onEncrypt); 
QNetworkRequest r(QUrl::fromUserInput("https://www.qt.io")); 
mgr.get(r); 

Toujours aboutir à aucune correspondance. Fait intéressant, la sortie hexadécimale de la clé publique est beaucoup plus grande que celle affichée par Windows.

Comment obtenir la clé publique du certificat présenté par le serveur et la vérifier par rapport à ce qui est présent dans le certificat?

Répondre

0

Comment peut-on obtenir la clé publique du certificat présenté par le serveur

La clé publique est une partie de le certificat. Le certificat contiendra également des hachages, qui permettent des vérifications d'intégrité de base sur le contenu du certificat. Pour vérifier si un serveur correspond réellement au certificat, vous devez essayer d'établir un canal crypté. Soit le serveur amorce le canal chiffré d'une manière cohérente avec le certificat observé par le client, c'est-à-dire que le serveur correspond au certificat qui lui est présenté; ou il ne fait pas - ce qui est une cause d'alarme.

le vérifier par rapport à ce qui est présent dans le certificat?

Les certificats X.509 contiennent également des hachages, qui peuvent être utilisés pour la vérification de l'intégrité.

La différence entre ce que Chrome montre et ce que fait votre code réside dans le fait que Chrome décode le PEM/DER/BER. DER/BER ajouter quelques métadonnées supplémentaires pour décrire des choses comme le type de champ et la longueur; PEM est un codage spécifique du contenu du certificat X.509 sous-jacent.

+0

Cela ne répond pas vraiment à ma question. Oui, la clé publique fait partie du certificat, mais je dois le valider pour m'assurer qu'il s'agit bien du certificat attendu (et donc du vrai serveur), pas seulement d'un certificat auto-signé (qui serait également approuvé s'il était ajouté au magasin de confiance)) quelque part. Impossible d'utiliser l'empreinte car elle change si le certificat est renouvelé, alors que la clé publique ne change pas nécessairement. – Phoenix

+0

Il ne ressortait pas clairement de votre question que vous le saviez. Si vous attendez une certaine clé publique, vous attendez, par extension, une certaine valeur pour la signature. D'autres domaines comme le CN ne devraient pas changer après tout. Le point d'un certificat X.509 est que vous ne vous souciez pas vraiment de la clé du serveur, mais plutôt que toute clé qui correspond au cert le fera et que vous avez la chaîne de confiance externe de cert à CA. au truststore client pour valider * ce fait * à la place. – user268396

0

Si vous souhaitez envoyer une demande avec vérification par les pairs, il n'est pas nécessaire de vérifier manuellement. Utilisez QSslConfiguration et définissez votre certificat sur Chrome en tant que certificat d'autorité de certification. Exemple:

QSslConfiguration config = QSslConfiguration::defaultConfiguration(); 
// Load certificate from file to QByteArray chromeCertificateByteArray 
QSslCertificate ca = QSslCertificate(chromeCertificateByteArray); 
QList <QSslCertificate> caList; 
caList.append(ca); 
config.setCaCertificates(caList); 

QNetworkRequest request(QUrl::fromUserInput("https://www.qt.io")); 
request.setSslConfiguration(config); 

QNetworkAccessManager networkManager; 
QNetworkReply* reply = networkManager.get(request); 
+0

Alors prenez simplement la chaîne CA et faites-en la seule AC acceptée pour cette connexion? Que faire si le certificat est renouvelé et que l'AC décide d'utiliser un autre certificat intermédiaire? Ou change leur certificat racine pour la signature? Dans ce cas, cela échouerait si je comprenais bien. – Phoenix