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

2024-02-20

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 以外的格式持开放态度,如果它们适用于所有平台

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

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

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

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

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

最简单的方法是:

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 在linux上安装python ssl模块,无需重新编译

    是否可以在已经安装了 OpenSSL 的 Linux 机器上安装 python 的 SSL 模块 而无需重新编译 python 我希望它就像复制几个文件并将它们包含在库路径中一样简单 Python版本是2 4 3 谢谢 是否可以在已经安装了
  • 在c#中执行Redis控制台命令

    我需要从 Redis 控制台获取 客户端列表 输出以在我的 C 应用程序中使用 有没有办法使用 ConnectionMultiplexer 执行该命令 或者是否有内置方法可以查找该信息 CLIENT LIST是 服务器 命令 而不是 数据库
  • 为什么pow函数比简单运算慢?

    从我的一个朋友那里 我听说 pow 函数比简单地将底数乘以它的指数的等价函数要慢 例如 据他介绍 include
  • ComboBox DataBinding 导致 ArgumentException

    我的几个类对象 class Person public string Name get set public string Sex get set public int Age get set public override string
  • IdentityServer 4 对它的工作原理感到困惑

    我阅读和观看了很多有关 Identity Server 4 的内容 但我仍然对它有点困惑 因为似乎有很多移动部件 我现在明白这是一个单独的项目 它处理用户身份验证 我仍然不明白的是用户如何注册它 谁存储用户名 密码 我打算进行此设置 Rea
  • 查找进程的完整路径

    我已经编写了 C 控制台应用程序 当我启动应用程序时 不使用cmd 我可以看到它列在任务管理器的进程列表中 现在我需要编写另一个应用程序 在其中我需要查找以前的应用程序是否正在运行 我知道应用程序名称和路径 所以我已将管理对象搜索器查询写入
  • 函数参数的默认参数是否被视为该参数的初始值设定项?

    假设我有这样的函数声明 static const int R 0 static const int I 0 void f const int r R void g int i I 根据 dcl fct default 1 如果在参数声明中指
  • unordered_map 中字符串的 C++ 哈希函数

    看起来 C 标准库中没有字符串的哈希函数 这是真的 在任何 c 编译器上使用字符串作为 unordered map 中的键的工作示例是什么 C STL提供模板专业化 http en cppreference com w cpp string
  • 对 std::vector 进行排序但忽略某个数字

    我有一个std vector
  • File.AppendText 尝试写入错误的位置

    我有一个 C 控制台应用程序 它作为 Windows 任务计划程序中的计划任务运行 此控制台应用程序写入日志文件 该日志文件在调试模式下运行时会创建并写入应用程序文件夹本身内的文件 但是 当它在任务计划程序中运行时 它会抛出一个错误 指出访
  • 启动时的 Excel 加载项

    我正在使用 Visual C 创建 Microsoft Excel 的加载项 当我第一次创建解决方案时 它包含一个名为 ThisAddIn Startup 的函数 我在这个函数中添加了以下代码 private void ThisAddIn
  • 打破 ReadFile() 阻塞 - 命名管道 (Windows API)

    为了简化 这是一种命名管道服务器正在等待命名管道客户端写入管道的情况 使用 WriteFile 阻塞的 Windows API 是 ReadFile 服务器已创建启用阻塞的同步管道 无重叠 I O 客户端已连接 现在服务器正在等待一些数据
  • 为什么这个二维指针表示法有效,而另一个则无效[重复]

    这个问题在这里已经有答案了 这里我编写了一段代码来打印 3x3 矩阵的对角线值之和 这里我必须将矩阵传递给函数 矩阵被传递给指针数组 代码可以工作 但问题是我必须编写参数的方式如下 int mat 3 以下导致程序崩溃 int mat 3
  • C++ 中的双精度型数字

    尽管内部表示有 17 位 但 IEE754 64 位 浮点应该正确表示 15 位有效数字 有没有办法强制第 16 位和第 17 位为零 Ref http msdn microsoft com en us library system dou
  • WPF DataGridTemplateColumn 组合框更新所有行

    我有这个 XAML 它从 ItemSource 是枚举的组合框中选择一个值 我使用的教程是 http www c sharpcorner com uploadfile dpatra combobox in datagrid in wpf h
  • 将数组作为参数传递

    如果我们修改作为方法内参数传递的数组的内容 则修改是在参数的副本而不是原始参数上完成的 因此结果不可见 当我们调用具有引用类型参数的方法时 会发生什么过程 这是我想问的代码示例 using System namespace Value Re
  • 我可以在“字节数”设置为零的情况下调用 memcpy() 和 memmove() 吗?

    当我实际上没有什么可以移动 复制的时候 我是否需要处理这些情况memmove memcpy 作为边缘情况 int numberOfBytes if numberOfBytes 0 memmove dest source numberOfBy
  • 如何减少具有多个单元的 PdfPTable 的内存消耗

    我正在使用 ITextSharp 创建一个 PDF 它由单个 PdfTable 组成 不幸的是 对于特定的数据集 由于创建了大量 PdfPCell 我遇到了内存不足异常 我已经分析了内存使用情况 我有近百万个单元格的 1 2 在这种情况下有
  • 不区分大小写的字符串比较 C++ [重复]

    这个问题在这里已经有答案了 我知道有一些方法可以进行忽略大小写的比较 其中涉及遍历字符串或一个good one https stackoverflow com questions 11635 case insensitive string
  • OpenCV SIFT 描述符关键点半径

    我正在深入研究OpenCV的SIFT描述符提取的实现 https github com Itseez opencv blob master modules nonfree src sift cpp 我发现了一些令人费解的代码来获取兴趣点邻域

随机推荐

  • 如何在validationif装饰器nestjs类验证器中使用else条件?

    我需要有条件地验证在 Nestjs 类验证器中提交的输入 有一个 validateif 装饰器 但如何在 else 部分添加另一个验证 例如 如果第一个输入是电子邮件 则使用电子邮件装饰器 如果它是电话 则与我的正则表达式匹配 IsNotE
  • DCF77 解码器与噪声信号

    我几乎完成了我的开源 DCF77 解码器项目 当我注意到标准 Arduino DCF77 库在噪声信号上表现非常差时 这一切就开始了 特别是当天线靠近计算机或洗衣机正在运行时 我永远无法从解码器中获取时间 我的第一个方法是向输入信号添加 数
  • JavaFx:组合框表格单元格双击

    问题如下 我有一个TableView with ComboBoxes对于每个 TableCell 我可以选择 组合框中的值 问题是 如果我有很多行和列 我必须多次单击才能在每个组合框中选择适当的值 要在组合框中选择一个值 我必须单击四次才能
  • JDK5/JDK 6 将 String 转换为 Date 时有什么区别

    JDK 5 是否可以生成 default message Failed to convert property value of type java lang String to required type java util Date f
  • VIEW 中的 ORDER BY 返回不同结果的 SQL

    这是我的观点 CREATE VIEW STD USER view TransInvoice AS SELECT TOP 999999 Customernr Referensnr 2 as a InvoiceRowData FileHead
  • wxPython 因分段错误而崩溃

    我很困惑为什么我的应用程序因分段错误而崩溃 我有一个使用 wxPython 作为前端的 python 应用程序 我的应用程序因分段错误而随机崩溃 我知道它必须是 wxPython 因为我有相同代码的控制台版本 并且它不会崩溃 前端是一个只读
  • Docker 容器中卷的权限错误

    我通过本地 docker machine VM 在 OSX 10 11 中运行 Docker 1 8 1 我有以下 docker compose yml web build docker web ports 80 80 8080 8080
  • 在 Monotouch 中编译 lambda 并调用设备上的委托

    我目前正在 MonoTouch 中移植 NET 代码库 并且目前正在研究一种接收Expression
  • 为什么我的“计数前导零”程序出现故障?

    以下代码返回 Hacker s Delight 书中的前导零的数量 include
  • 当我重命名项目时,Xcode 6.3 崩溃

    昨天我将 Xcode 更新到 6 3 版本 因为我的 iPhone 具有 8 3 软件版本 并且 Xcode 想要最新版本来运行该应用程序 现在一切都已更新 但 Xcode 无法再重命名该项目了 如果我复制该项目 然后打开它并在 身份 和
  • 如何将我的编译器与 eclipse 集成?

    我有一个使用 flex bison 和 C 编写的迷你编译器 我想在 eclipse 中使用它 就像使用java编译器一样 但我不知道如何做到这一点 所以我需要一些帮助和一些建议 Thanks 创建商业品质的 Eclipse IDE htt
  • 无法启动 net 6 + React 应用程序的 SPA 代理

    我正在创建一个基于 ASP NET CORE Web 应用程序 React 模板的新项目 然后我根据需要配置 ClientApp 我使用自己的 webpack config js 而不是 CRA 前端工作正常 当我运行它时它按预期启动npm
  • jQuery 启用/禁用显示/隐藏按钮和选择选项。获取剩余选项值

    我有一个使用文本字段中的值填充的选择列表 我还有两个按钮 一个添加按钮 用于将输入的值添加到选择列表中 一个删除按钮 用于从选择列表中删除输入的值 我想使用 jQuery 执行以下操作 如果在文本字段中输入的值为无法使用在选择列表中 显示添
  • PHP Curl 异步响应

    我有一个 PHP 文件 它通过curl 调用另一个PHP 文件 我试图让第二个文件向第一个文件发送响应 让它知道它已启动 问题是第一个不能等待第一个完成执行 因为这可能需要一分钟或更长时间 我需要它立即发送响应 然后继续处理常规业务 我尝试
  • Wordpress,为所有链接添加 标签

    当我在 WordPress 网站上撰写博客文章时 我想在所有锚标记内动态添加一个 span 标记 其数据属性与锚标记具有相同的值 Example 我在 WordPress 中写的内容 p Some text with a href a li
  • 在 TriggerDagRunOperator 中提供上下文

    我有一个 dag 它被另一个 dag 触发 我已经通过这个 dag 传递了一些配置变量DagRunOrder payload字典以同样的方式官方示例 https github com apache incubator airflow blo
  • 寻找最常见的组合

    我有一个包含 2 列 ID 号和品牌的数据框 X1 X2 1234 A89 1234 A87 1234 A87 1234 A32 1234 A27 1234 A27 1235 A12 1235 A14 1235 A14 1236 A32 1
  • swift2 中协议扩展的限制和默认值

    所以我在研究协议扩展时遇到了一个 有趣 的问题 我想写一个Meters and Kilometers用于测试某些东西的单元类型 作为一个类 它非常容易做到这一点 其中有一个基类 并且两个子类都覆盖基类 而只是覆盖一个简单的值 Convers
  • 使用 js.dart 公开 auth0 API

    我正在编写一个 Dart Angular2 应用程序 但它与当前的问题无关 我试图通过使用 1https pub dartlang org packages js 公开它的 API 来将 Auth0Lock 与 dart 一起使用 我正在使
  • 如何在 Mac OSX 上的 Qt 中使用 pkcs12/pfx 成功执行 SSL 加密?

    Qt 新手和开发跨平台应用程序 需要来自服务器和客户端的 SSL 身份验证基于 pem 的加密适用于 Linux Android Windows 然而 Mac OSX 存在问题 我们的代码如下所示 QFile privateKeyFile