5

我正在尝试在 iOS 应用程序中实现 SSL 相互身份验证。在我看到的大多数示例中,客户端证书与应用程序包捆绑在一起。但就我而言,我需要远程加载客户端证书(即,通过链接或通过电子邮件)。

如果我尝试从外部源(即邮件应用程序)加载证书,它会导航到设置应用程序并将其安装到苹果的钥匙串中。因此,我的应用程序无法访问此证书。

所以有人请为此提出一个想法吗?

4

1 回答 1

8

我在我们内部的 iPad 应用程序中构建了一个这样的系统。

忘记系统首选项、配置文件等。以这种方式安装的所有证书都无法访问第三方应用程序,但只能访问系统应用程序,可能是因为已安装到 Apple 钥匙串中。

我探索了这三种加载证书的方法,并使用了最后一种:

  1. 捆绑到应用程序中,正如您已经看到的那样是不切实际的
  2. 从另一个应用程序发送文件(例如电子邮件)
  3. 使用链接下载(我做了什么)

前言

  • 我认为您已经使用 CA 构建了您的 simil-PKI,以自动/手动方式颁发/撤销证书等。 所以问题是交付给设备。
  • 对于所有解决方案,我建议使用强密码以 PKCS #12 格式保存私钥和证书。
  • 使用 MDM 管理设备,如果您的应用程序是内部应用程序并且将与公司的设备一起使用,请监督它们以增加选项(例如 Meraki,是免费的,但不处理 ManagedAppConfiguration)

解决方案

解决方案1)

不切实际,因为很难(甚至不可能)生成具有特定证书的不同版本的应用程序。更不用说在用户的每台设备上处理特定版本的分发几乎是不可能的。

解决方案2)

  • 保存 .p12 文件
  • 将文件扩展名更改为自定义扩展名
  • 注册该扩展程序以使用您的应用程序打开,因此在“打开方式...”中将列出您的应用程序 “打开方式”以用于特定文档类型

最安全的方法应该是用户可以选择密码来加密 .p12 文件,这样当打开 p12 时,用户必须输入他的密码,但这会导致其他工作使其工作。一种不太安全但可行的方法是使用嵌入在应用程序中的单个强密码并将其用于所有 .p12 文件

解决方案 3)

与 2) 类似,但您直接从 Web 应用程序的特定 URI 下载文件,这允许一些自动配置,因为应用程序可以识别自己。

基本上这些是步骤:

  • 该应用程序通过 HTTPS 连接到我们应用程序的特定 URL。
  • 检查服务器证书是否正确(受信任的来源)。
  • 发送一些东西进行身份验证。
    在我们的例子中,我使用在设备准备期间设置的设备名称,并且可以使用 MDM 远程更改它。
  • 下载包含证书的配置包
    我使用 JSON 有效负载发送 PKCS #12 文件 base64 编码和其他数据来配置应用程序。

如果您的 MDM 支持 ManagedAppConfiguration,您可以稍微更改这些操作以构建更灵活的行为:使用 ManagedAppConfiguration,您可以远程在每个应用程序 NSUserDefaults 中发送特定字符串,因此您可以使用不同的或临时的 URL/令牌来下载配置包和完全放弃使用设备名称进行身份验证。

WWDC 2014 #704 - 为企业和教育构建应用程序 ~13:00
Apple Developer - ManagedConfig 示例应用程序

增加偏执狂

  • 记录一切!这部分应用程序所做的一切(失败/错误请求、不存在的设备名称请求等)

  • 仅当我们需要配置新设备时,才会激活/停用配置 URL。
    您可以通过多种方式完成此操作,我的 web 应用程序检查特定文件的存在,因此我可以执行诸如touch APP_CERTIFICATES_CONFIG_ENABLED激活自动配置服务并禁用所有删除文件的操作。
    只是为了确保没有我的监督,任何证书都不会流通。

于 2015-03-10T20:41:17.587 回答