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

时间:2017-08-24 15:20:29

标签: 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的加密。

  

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 fails to parse PFX file
在上面的情况中,QSslCertificate::importPkcs12()对原始.pfx文件返回false。即使我们从命令行生成一个新的.pfx,对于上述函数也是如此。

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

注意

  • 服务器支持.pfx& 。质子交换膜。我们用常规的C OpenSSL库确认了这一点。但我们希望使用Qt实现它。
  • 我们对.pfx以外的格式开放,如果它们适用于所有平台

1 个答案:

答案 0 :(得分:1)

免责声明:我是从头脑中写出来的,因为我不会亲自拥有Mac并且无法再验证它。

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

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

我们还注意到,成功加载的私钥将存储在Mac的密钥存储区内,并且可以由用户查看和导出,我们也不想这样做。

我们最终重新编译QtNetwork模块以使用OpenSSL而不是Secure Transport。您需要为此提供OpenSSL,因为OSX不再包含标头。我认为自制软件安装就足够了。除此之外,编译令人惊讶地无痛且快速,因为你只需要编译一个小模块,而不是整个Qt。

最简单的方法是:

  1. 下载您正在运行的Qt版本的源代码发布
  2. ./configure使用OpenSSL(我相信-openssl开关)
  3. cd进入network文件夹
  4. make
  5. 复制Qt-Installation中生成的QtNetwork.framework并替换现有的{{1}}。
  6. 随着一切按预期工作。