【问题标题】:iOS - how do I get server certificate into iOS client keychain for pinningiOS - 如何将服务器证书放入 iOS 客户端钥匙串以进行固定
【发布时间】:2017-10-07 12:20:05
【问题描述】:

TL;DR 版本:有没有什么方法可以将服务器证书传递给 iOS 客户端,而不涉及传递服务器的私钥?

我编写了一个与我的 macOS 服务器应用程序通信的 iOS 客户端应用程序(因此我可以控制两端)。我已经使用自签名证书实现了证书固定,以使事情更安全。为了在开发过程中实现这一点,我将服务器证书硬编码到 iOS 客户端应用程序中,并告诉客户端只连接到在 TLS 握手期间为您提供确切证书的服务器。一切都很好。

但是,在现实世界中,我将此系统作为一组销售(1 个服务器,每个客户有多个客户端),因此我无法将服务器证书硬编码到 iOS 客户端中。我的计划是将服务器证书带外(通过电子邮件)传递给 iOS 客户端,如下所述:Making Certificates and Keys Available To Your App:

应用只能访问其自己的钥匙串访问组中的钥匙串项。

要在您自己的应用中使用数字身份,您需要编写代码来导入它们。这通常意味着读取 PKCS#12 格式的 blob,然后使用函数 SecPKCS12Import 将 blob 的内容导入应用的钥匙串中

提供身份的一种方法是通过电子邮件。当您配置设备时,向关联用户发送一封电子邮件,并附上他们的客户端身份作为 PKCS#12 文件。

我的问题是 .p12 文件包含证书服务器的私钥 - 传递私钥似乎也是非常错误的。

有没有其他方法可以将服务器证书传递给 iOS 客户端,而不涉及传递服务器的私钥?

谢谢!!!

【问题讨论】:

    标签: ios security ssl pinning


    【解决方案1】:

    我在这里想太多了,解决方案实际上很简单。

    我只需要将服务器的公共证书带外通过电子邮件发送到具有自定义扩展名(如cert.myCustomExt1234)的客户端设备。这是因为 .crt 扩展已被 iOS 声明,因此您必须注册您的应用程序以处理自定义扩展 (see apple docs here)。然后在我的应用程序中,我可以使用带外交付的服务器公共证书来完成证书固定的所有逻辑。

    关键是将文件扩展名更改为 iOS 尚未声明的内容。

    【讨论】:

    • 嘿,您有示例链接或 git repo。我正在为我的应用程序尝试相同的方法。
    • @amrendersingh 抱歉,我没有任何代码示例供您参考。但是根据我在服务器上的记忆,我们获取了公钥并制作了一个自定义 info.json 文件,其中包含一些信息,例如 serverID、serverName 等,并使用带有自定义扩展名的 SSZipArchive 将其压缩并通过电子邮件发送出去。客户端然后解析 info.json 并通过保存它来处理公钥(在本地文件系统或钥匙串中..不记得了)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多