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身份验证也可以。
注意:
最佳答案
免责声明:由于我个人不拥有Mac,因此无法对其进行验证,因此我是从脑海中写这本书的。
大约一两年前,我在上一份工作中遇到了这个确切的问题。
一切归结为Apple放弃了对OpenSSL的支持。
因此,在Mac上使用Qt5.6的情况下,Qt从OpenSSL后端切换到了Secure Transport后端。现在,安全传输实现缺少一些功能。例如,我们无法加载私钥pem文件。我认为从PKCS#8切换到PKCS#1很有帮助,它们都可以存储在.pem
文件中,并且看起来几乎相同,因此花了一些时间才弄清楚。
我们还注意到,成功加载的私钥将存储在Mac的 key 存储区中,并且用户可以从那里查看和导出,我们也不希望这样做。
最后,我们重新编译了QtNetwork模块以使用OpenSSL而不是安全传输。您将需要为此提供OpenSSL,因为OSX不再包含 header 。我认为自制安装就足够了。除此之外,编译过程令人惊讶且轻松快捷,因为您只需要编译一个小模块,而不是整个Qt。
最简单的方法是:
./configure
使用OpenSSL(我相信-openssl
开关)cd
放入network
文件夹make
QtNetwork.framework
复制到Qt安装中,并替换现有的这样,一切都按预期进行。
关于c++ - 如何在Mac OSX的Qt中使用pkcs12/pfx成功执行SSL加密?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45865375/