c++ - 使用 QSslCertificate 在 Qt 中正确导入 pkcs12
问题描述
我想使用 QSslCertificate 导入私钥和证书。
QFile keyFile(QDir::currentPath()+ "/privatekey.pfx");
keyFile.open(QFile::ReadOnly);
QString password = "Password";
QSslKey key(keyFile.readAll(), QSsl::Rsa, QSsl::Der, QSsl::PrivateKey);
QFile certFile(QDir::currentPath()+ "/certificate.crt");
certFile.open(QFile::ReadOnly);
QSslCertificate certificate;
QList<QSslCertificate> importedCerts = QSslCertificate::fromData(certFile.readAll());
bool imported = QSslCertificate::importPkcs12(&keyFile, &key, &certificate, &importedCerts);
QSslConfiguration config = QSslConfiguration();
config.setCaCertificates(importedCerts);
config.setLocalCertificate(certificate);
config.setPrivateKey(key);
config.setProtocol(QSsl::SecureProtocols);
config.setPeerVerifyMode(QSslSocket::VerifyPeer);
根据文档,我以 pfx 格式加载私钥。在调试模式下,每次我从 QSslCertificate::importPkcs12 得到错误的结果。可能是什么原因?
解决方案
您使用的 API 完全错误。该方法的key和certificate指针参数是out参数,你不应该预先用数据填充它们。
假设您有一个包含主证书的 PKCS#12 文件,要获取主证书的私钥、证书和可选的证书链,正确的用法是:
QFile pfxFile(QDir::currentPath()+ "/privatekey.pfx");
bool isOpen = pfxFile.open(QFile::ReadOnly);
// you should verify the file is open here!
// all default contructed, as they are filled by the importPkcs12 method
QSslKey key;
QSslCertificate certificate;
QList<QSslCertificate> certChain;
// now import into those three
bool imported = QSslCertificate::importPkcs12(&pfxFile, &key, &certificate, &certChain, password);
// imported should be true now, continue creating the ssl config as you did before
推荐阅读
- python - Python中带有字符串的正则表达式
- docker - 如何使用 docker go-lang API 的 TaskLogs 端点?
- c# - 在 linq Select 语句中将文本组合在一起?
- exchange-server - Release-QuarantineMessage EWS 接口等效
- apache-kafka - Kafka API 的最佳参考文档
- recursion - Ocaml中的计数器变量?
- c++ - c ++运输分配自动终止
- java - 在 google 磁盘 api 中使用凭据的问题
- c# - 3D 空间中的激光投影仪校准
- git - Jenkins Git Changelog 插件在与 JIRA 交谈时抛出“无协议”错误