QSSLCertificatifific如何获取Windows中显示的公共密钥
QSslCertificate how to get public Key as displayed in Windows
Windows查看Chrome中的证书详细信息时显示的给定证书的公共密钥与连接到加密信号的插槽中的QT返回的内容不同。
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 matchedn";
else if (windowsKey == publicKey.toDer())
std::cout << "DER key matchedn";
else if (winHexKey == publicKey.toPem().toHex())
std::cout << "Hex PEM key matchedn";
else if (winHexKey == publicKey.toDer().toHex())
std::cout << "Hex DER key matchedn";
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);
总是没有匹配。有趣的是,公共密钥的十六进制要比Windows显示的任何内容都要大得多。
如何获得服务器呈现证书的公共密钥,并根据证书中的内容进行验证?
如何获得服务器呈现证书的公共密钥
公共密钥是证书的一部分。证书还将包含哈希,这可以在证书内容上进行一些基本的完整性检查。要检查服务器是否实际与证书匹配,您必须尝试建立一个加密的频道。服务器要么以与客户端观察到的证书一致的方式引导加密通道 - 也就是说,服务器与呈现的证书匹配;或者没有 - 这是引起警报的原因。
根据证书中的内容进行验证吗?
X.509证书还包含哈希,可用于完整性检查。
Chrome显示的内容与您的代码所做的内容之间的差异是Chrome解码PEM/der/ber的事实。der/ber添加一些额外的元数据来描述诸如现场类型和长度之类的事物;PEM是基础X.509证书内容的特定编码。
如果要使用PEER验证发送请求,则无需手动验证。使用QSslConfiguration
并将您的证书文件从Chrome设置为CA证书。示例:
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);
相关文章:
- SSH通过/sbin/SSH无法读取RSA密钥文件(从控制台运行)
- 允许从 std::map 的密钥窃取资源?
- TMap::Emplace() 在应用现有密钥时会覆盖吗?
- 在没有密钥的情况下读取密文的剩余噪声预算
- 如何修复无效的API密钥,IP或操作权限错误?
- 所有可能的链接生成器与64位密钥
- 如何在unordered_map中更改密钥?
- 获取当前密钥状态?
- curl_easy_perform() 失败:SSL 对等证书或 SSH 远程密钥不正常
- 将密钥发送到非前台的游戏窗口
- 有哪些方法可以对基于 256 位密钥的矩阵进行加扰?
- 如何在精灵表上的两个不同部分之间来回切换,同时用户仍使用 SFML 持有密钥
- 如何将CNG密钥转换为OpenSSL EVP_PKEY(反之亦然)?
- 运行密钥密码解密知道密钥?
- std::unordered_map 运算符 [] 是否对非现有密钥进行零初始化?
- 封装 std::map 以允许迭代,但没有直接密钥访问?
- 如果我使用同一个密钥推送用户数据两次,会发生什么
- 如何在C++中创建自己的编译密钥
- QSSLCertificatifific如何获取Windows中显示的公共密钥
- 是否可以显示需要线性搜索的时间才能找到您在程序中找到的密钥