我正在尝试在 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."
有什么想法吗?
尝试使用 Qt < 5.6 like Qt 5.5.
在 Qt 5.6 中,默认 SSL 后端从 OpenSSL 更改为 Mac OS 平台上的安全传输。
此问题已作为 Bug 填写:https://bugreports.qt.io/browse/QTBUG-56596
平台 | SSL 库 | 导入Pkcs12 |
---|---|---|
Windows、Linux、安卓 | OpenSSL | 支持 |
macOS、iOS | 安全运输 | 未实现的代码 |
上表应该可以让您了解为什么在 macOS、iOS 上调用
QSslCertificate::importPkcs12
时会收到“未实现的代码”。
对于 macOS、iOS,您必须使用“安全传输”SSL 库,否则您可能无法将应用程序提交到 App Store。
[编辑]这个答案是旧的,基于 Qt5.15.x,尚未针对 Qt6.x 进行测试。
此答案基于将“安全传输”保留为默认 SSL 库,但也静态链接 OpenSSL 库的部分,以便您可以获得 importPkcs12() 功能。
下面为您提供了 importPkcs12() 的黑盒包装器,它根据您所在的平台在两者之间切换。
#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 先决条件,请参阅此处: