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()
回报true
对于Mac。当我们提到这个帖子 https://github.com/curl/curl/issues/283,它表示 Mac 不支持基于 .pem 的加密。
curl 的安全传输后端仅支持 PKCS#12 (P12) 格式的客户端 ID;它不支持 PEM 格式的客户端 ID,因为 Apple 不允许我们在不使用私有 API 的情况下从 PEM 格式的身份文件创建安全身份。而且我们不能使用私有API,因为使用私有API的应用程序在苹果的任何应用商店中都是不允许的。
由于我的理解有限,我认为 .pem 不是与服务器进行 SSL 通信的好主意。如果说错了请阻止我!
因此,我们决定将所有平台迁移到 .pfx。我们已经有一个带有密码的 .pfx 文件。我们将上面的代码转换为与 .pfx 兼容(即“Certificate.pfx”,我们有这个旧文件以及“Certificate.pem”)。代替QSsl::Pem
, 我们尝试了QSsl::Der
。但正如预料的那样,它没有起作用。然而,也没有加密错误,但我们确信我们做错了什么。 :-)
我们参考了这篇文章并尝试从 .pem 重新生成 .pfx,但这也没有帮助。
QSslCertificate::importPkcs12 无法解析 PFX 文件 https://stackoverflow.com/q/39394029
在上述情况下,QSslCertificate::importPkcs12()
对于原始 .pfx 文件返回 false。即使我们从命令行生成一个新的 .pfx,上述函数也会失败。
Question:有人可以帮助提供使用服务器执行 .pfx 加密的确切方法吗?
.pem 身份验证也可以。
Note:
- 服务器支持 .pfx 和 .pem。我们通过常规 C OpenSSL 库确认了这一点。但我们想用Qt来实现。
- 我们对 .pfx 以外的格式持开放态度,如果它们适用于所有平台