【问题标题】:Import properly pkcs12 in Qt using QSslCertificate使用 QSslCertificate 在 Qt 中正确导入 pkcs12
【发布时间】:2018-10-12 17:20:32
【问题描述】:

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

【问题讨论】:

    标签: c++ qt pkcs#12


    【解决方案1】:

    您使用的 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-07
      • 1970-01-01
      • 2020-09-27
      • 2016-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-01
      相关资源
      最近更新 更多