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

iam*_*ind 8 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));
Run Code Online (Sandbox Code Playgroud)

在上面的代码privateKey().isNull()返回trueMac.当我们推荐这篇文章时,它说Mac不支持基于.pem的加密.

Secure Transport后端卷曲仅支持PKCS#12(P12)格式的客户端ID; 它不支持PEM格式的客户端ID,因为Apple不允许我们在不使用私有API的情况下以PEM格式从身份文件创建安全标识.我们无法使用私有API,因为Apple的任何应用商店都不允许使用私有API的应用.

由于理解有限,我解释说.pem对于与服务器进行SSL通信并不是一个好主意.如果这是错的,请阻止我!

因此,我们决定转移到所有平台的.pfx.我们已经有一个带密码的.pfx文件.我们将上面的代码转换为与.pfx兼容(即"Certificate.pfx",我们将此旧文件与"Certificate.pem"一起使用).而不是QSsl::Pem,我们试过QSsl::Der.但正如预期的那样,它没有用.但是,也没有加密错误,但我们确信我们做错了.:-)

我们引用了这篇文章并尝试从.pem重新生成.pfx,但这也没有帮助.
QSslCertificate :: importPkcs12无法解析PFX文件
在上述情况下,QSslCertificate::importPkcs12()原始.pfx文件返回false.即使我们从命令行生成一个新的.pfx,对于上面的函数也是如此.

问题:有人可以帮助确切地与服务器执行.pfx加密吗?
.pem身份验证也没关系.

注意:

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

Ste*_*low 1

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

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

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

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

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

最简单的方法是:

  1. 下载您正在运行的 Qt 版本的源代码发行版
  2. ./configure它使用 OpenSSL (-openssl我相信是这个开关)
  3. cd进入network文件夹
  4. make
  5. 复制QtNetwork.frameworkQt 安装中生成的文件并替换现有的。

这样一切就按预期进行了。