c++ - 如何在 Mac OSX 上的 Qt 中使用 pkcs12/pfx 成功执行 SSL 加密?

标签 c++ macos qt openssl pkcs#12

Qt 新手和开发跨平台应用程序,需要服务器和客户端的 SSL 身份验证 基于 .pem 的加密在 Linux、Android、Windows 上运行。但是 Mac OSX 存在问题。我们的代码如下所示:

QFile privateKeyFile(":/Certificate.pem");  // --> has certificate + key
privateKeyFile.open(QIODevice::ReadOnly | QIODevice::Text);      
setLocalCertificateChain(QSslCertificate::fromPath(":/Certificate.pem", QSsl::Pem));
setPrivateKey(QSslKey(privateKeyFile.readAll(), QSsl::Rsa));

在上面的代码中,privateKey().isNull() 为 Mac 返回 true。当我们提到this post ,它表示 Mac 不支持基于 .pem 的加密。

The Secure Transport back-end to curl only supports client IDs that are in PKCS#12 (P12) format; it does not support client IDs in PEM format because Apple does not allow us to create a security identity from an identity file in PEM format without using a private API. And we can't use the private API, because apps that use private API are not allowed in any of Apple's app stores.

以我有限的理解,我认为 .pem 不是与服务器进行 SSL 通信的好主意。如有不妥请阻止!

因此,我们决定为所有平台迁移到 .pfx。我们已经有了一个带有密码的 .pfx 文件。我们将上面的代码转换为与 .pfx 兼容(即“Certificate.pfx”,我们有这个旧文件以及“Certificate.pem”)。我们尝试了 QSsl::Der,而不是 QSsl::Pem。但正如所料,它没有奏效。然而,也没有加密错误,但我们确信我们做错了什么。 :-)

我们引用了这篇文章并尝试从 .pem 重新生成 .pfx,但这也没有帮助。
QSslCertificate::importPkcs12 fails to parse PFX file
在上述情况下,QSslCertificate::importPkcs12() 为原始 .pfx 文件返回 false。即使我们从命令行生成一个新的 .pfx,上述功能也会失败。

问题:有人可以帮助提供使用服务器执行 .pfx 加密的确切方法吗?
.pem 身份验证也可以。

注意:

  • 服务器同时支持 .pfx 和 .pem。我们通过常规 C OpenSSL 库确认了这一点。但我们想用 Qt 来实现它。
  • 我们对 .pfx 以外的格式持开放态度,如果它们适用于所有平台

最佳答案

免责声明:我是凭着自己的想法写这篇文章的,因为我个人没有 Mac,也无法再验证它。

大约一两年前,我在上一份工作中遇到了这个问题。 这一切都归结为 Apple 放弃了对 OpenSSL 的支持。

因此,Qt 在 Mac 上使用 Qt5.6 从 OpenSSL 后端切换到 Secure Transport 后端。现在,安全传输实现缺少一些功能。例如,我们无法加载私钥 pem 文件。我认为从 PKCS#8 切换到 PKCS#1 有所帮助,它们都可以存储在 .pem 文件中并且看起来几乎相同,因此需要一段时间才能弄明白。

我们还注意到,成功加载的私钥将存储在 Mac 的 keystore 中,用户可以从那里查看和导出,这也是我们不希望看到的。

我们最终重新编译了 QtNetwork 模块以使用 OpenSSL 而不是安全传输。您将需要为此提供 OpenSSL,因为 OSX 不再包含 header 。我认为自制软件安装就足够了。除此之外,编译出奇的轻松和快速,因为您只需编译一个小模块,而不是整个 Qt。

最简单的方法是:

  1. 下载您正在运行的 Qt 版本的源代码分发
  2. ./configure 使用 OpenSSL(我相信 -openssl 开关)
  3. cd进入网络文件夹
  4. 制作
  5. 将生成的 QtNetwork.framework 复制到您的 Qt 安装中并替换现有的。

一切都按预期进行。

关于c++ - 如何在 Mac OSX 上的 Qt 中使用 pkcs12/pfx 成功执行 SSL 加密?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45865375/

相关文章:

c++ - 如何在 Visual Studio 2017 中启动 HLSL 调试器?

macos - 启用关闭显示模式而不满足 Apple 的要求

qt - QPixmap.loadFromData() 不从 QByteArray 加载图像

python - Mac OS X 中的绑定(bind)键 - Tkinter

python - 如何以编程方式创建和管理macOS Safari书签?

带有 Raspberry Pi 3 和 BlueZ 5.39 的 Qt 5.7 QBluetooth LE GATT 服务器示例

c++ - 在 Linux 上为 Mac OS X 编译 Qt 应用程序

c++ - 为什么 auto i = same_const_variable 无法推断出 "const"?

带链表的 C++ 泛型容器

c++ - GCC 标准库实现中(void)强制转换的目的是什么?