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



以我的有限理解,我认为.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身份验证也可以。


注意:
  • Server支持.pfx和.pem。我们使用常规的C OpenSSL库进行了确认。但是我们想使用Qt实现它。
  • 如果它们可以在所有平台上使用
  • ,我们欢迎使用.pfx以外的格式

    最佳答案

    免责声明:由于我个人不拥有Mac,因此无法对其进行验证,因此我是从脑海中写这本书的。

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

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

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

    最后,我们重新编译了QtNetwork模块以使用OpenSSL而不是安全传输。您将需要为此提供OpenSSL,因为OSX不再包含 header 。我认为自制安装就足够了。除此之外,编译过程令人惊讶且轻松快捷,因为您只需要编译一个小模块,而不是整个Qt。

    最简单的方法是:

  • 下载正在运行的Qt版本的源代码发布
  • ./configure使用OpenSSL(我相信-openssl开关)
  • cd放入network文件夹
  • make
  • 将生成的QtNetwork.framework复制到Qt安装中,并替换现有的

  • 这样,一切都按预期进行。

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

    10-12 03:02