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?
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
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