如何在远程加载客户端证书的iOS中实现SSL相互身份验证?

时间:2014-09-25 10:02:31

标签: ios ssl mutual-authentication

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

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

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

1 个答案:

答案 0 :(得分:7)

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

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

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

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

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

    解决方案1)

    不切实际,因为使用特定证书生成不同版本的应用程序非常困难(不可能)。更不用说在用户的每个设备上处理特定版本的分发几乎是不可能的。

    解决方案2)

    • 保存.p12文件
    • 将文件扩展名更改为自定义
    • 注册该扩展程序以使用您的应用程序打开,因此在"打开..."将列出您的应用程序 "Open in" for specific document type

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

    解决方案3)

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

    基本上这些是步骤:

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

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

    WWDC 2014 #704 - Building Apps for Enterprise and Education ~13:00
    Apple Developer - ManagedConfig Sample App

    ADDED PARANOIA

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

    • 仅当我们需要配置新设备时,才会激活/停用配置URL 您可以通过多种方式完成此操作,我的webapp会检查是否存在特定文件,因此我可以执行touch APP_CERTIFICATES_CONFIG_ENABLED之类的操作来激活自动配置服务并禁用删除文件的所有内容。
      只是为了确保在没有我监督的情况下不会出现证书。