QSslCertificate :: importPkcs12无法解析PFX文件

时间:2016-09-08 14:49:24

标签: qt sockets ssl openssl pkcs#12

我正在尝试在我的Qt应用程序中解压缩我的pkcs12文件 - 但没有运气。我正在构建 Qt控制台应用程序(禁用GUI)

(我已按照本指南:https://github.com/trueos/sysadm-ui-qt/blob/master/src-qt5/gui_client/SSLNotes.txt

Pkcs12创建命令:

"openssl req -newkey rsa:2048 -nodes -keyout test_key.pem"
"openssl req -key test_key -new -x509 -out test_crt.crt"
"openssl pkcs12 -inkey test_key.pem -in test_crt.crt -export -passout stdin -out new.pfx"

Qt代码:

QString password="1234";
QFile pkcs("/Users/test/Desktop/certs/new.pfx");
pkcs.open(QFile::ReadOnly);
QSslKey key;
QSslCertificate cert;
QList<QSslCertificate> imported_certs;
static bool import=QSslCertificate::importPkcs12(&pkcs,&key,&cert,&imported_certs,QByteArray::fromStdString(password.toStdString()));

pkcs.close();
qDebug()<<import;

使用openssl命令手动提取密钥和文件。

错误消息:

"Unimplemented Code."

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

尝试使用Qt&lt; 5.6喜欢Qt 5.5。

在Qt 5.6中,Mac OS平台上的默认SSL后端已从OpenSSL更改为Secure Transport。

此问题已填写为错误:https://bugreports.qt.io/browse/QTBUG-56596

答案 1 :(得分:0)

用这种东西将头撞到墙上几次后,我发现了一条很好的捷径。

我将证书导入Windows计算机(确保将私钥标记为可导出)并验证证书路径在证书管理器中是否有效。如果我需要导入证书,我会在此处执行,直到颁发的证书路径良好为止。完成此操作后,我将证书和私钥重新导出到新的PKCS12文件中,包括根证书和中间证书。这会生成一个可以导入ASA或IOS路由器的单个文件,并且可以完美地工作,因为单元需要的所有内容都存在于一个文件中。

确保在导出证书集后从Windows计算机中删除证书。

也许这个链接会帮助你:

来自:https://supportforums.cisco.com/discussion/12347971/failed-parse-or-verify-imported-certifiate-asa-5505-831

答案 2 :(得分:0)

QSslCertificate :: importPkcs12()将返回“未实现的代码”。在macOS或iOS平台上运行,因为这些Qt套件已配置为使用安全传输而不是OpenSSL。

为了充分利用这两方面的优势,我发现可以将其Qt套件配置为安全传输,但是同时链接到OpenSSL以实现importPkcs12的OpenSSL特定实现。

以下是一个片段,我们在其中打开了针对macOS和iOS的自定义实现:

#ifdef Q_OS_IOS
#define IMPORTPKCS12_OPENSSL
#endif
#ifdef Q_OS_MACOS
#define IMPORTPKCS12_OPENSSL
#endif

bool ImportPkcs12Patch::importPkcs12(QIODevice *device, QSslKey *key, QSslCertificate *certificate, QList<QSslCertificate> *caCertificates, const QByteArray &passPhrase)
{
#ifdef IMPORTPKCS12_OPENSSL
    return importPkcs12_openssl(device, key, certificate, caCertificates, passPhrase );
#else
    return QSslCertificate::importPkcs12(device, key, certificate, caCertificates, passPhrase );
#endif
}

有关完整的工作示例,请在此处查阅示例:

https://github.com/stephenquan/QtImportPKCS12

要为iOS和macOS构建OpenSSL必备软件,请参阅此处:

https://github.com/stephenquan/build_openssl