使用QSslCertificate在Qt中正确导入pkcs12

时间:2018-10-12 17:20:33

标签: c++ qt pkcs#12

我想使用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获得错误结果。可能是什么原因?

1 个答案:

答案 0 :(得分:2)

您使用API​​完全错误。该方法的密钥和证书指针参数是 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