从应用程序中访问已安装的配置文件/证书

时间:2016-09-16 09:50:10

标签: ios web-services ssl ssl-certificate nsurlconnection

我将从我们的应用程序的一些背景信息开始:​​

我们的iOS应用程序连接到webservices,在大多数情况下(除少数白名单IP之外)需要进行身份验证。由于该系统应该非常安全,因此该公司选择使用客户端证书来允许访问服务器。每个用户都将获得根据他们是否将使用应用程序或Web界面生成的证书,他们必须自行下载和安装。

应用程序中的系统就是这样;用户将尝试连接到Web服务。初始基础'内部'网址会因为无法访问它而失败,因此基本网址将更改为需要证书的网址。当用户没有安装证书时,会有一个允许用户根据他们收到的QR码下载证书的过程。然后,证书将安装在应用程序中,用户可以自由访问Web服务并使用该应用程序。

此系统有效,但需要执行大量操作。

现在到现在:

我们希望让用户更轻松,使用该应用程序的公司希望获得更多控制权。基本上,正在制定一个系统,允许公司创建自己的证书,并且他们希望使用一些管理工具来分发它。在不太详细的情况下,情况将是所需的证书将安装到iOS本身,而不是在应用程序内。

这就是问题出现的地方,我似乎无法从应用程序中访问已安装的证书,并且不断收到401错误。

我做了一些研究以启动它,我的初步回答是“这将无法正常工作”,正如官方开发者页面的这一页所述:

In iOS, an app can access only its own items in the keychain—the user is never asked for permission or for a password.

但是因为我们想要100%肯定,我会继续寻找一段时间并最终遇到代码示例,如:

- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge;
{
    SecTrustRef trust = challenge.protectionSpace.serverTrust;
    NSURLCredential *credential = [NSURLCredential credentialForTrust:trust];
    [challenge.sender useCredential:credential forAuthenticationChallenge:challenge];
}

但这似乎没有得到任何已安装的证书或任何东西。

还设置了以下布尔值:

- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace;
{
    return YES;
}

- (BOOL)connectionShouldUseCredentialStorage:(NSURLConnection *)connection;
{
    return YES;
}

要在应用程序外部进行进一步检查,我已经查看了我们这里的iPad。它为网站安装了证书(不同于应用程序的权限),在Safari上我可以访问受证书保护的网站。但是,在Chrome和Firefox上,我会误认为网站需要证书。因此,这使我相信除非您基本上是Apple应用程序,否则无法访问这些证书。

所以基本上,我对这个问题的态度是最终的。这个问题的简短版本: 我是否可以在我的应用内访问iPhone上已安装的客户端证书,以访问需要此证书的网络服务?

如果是,那么长版本: 如何吗

1 个答案:

答案 0 :(得分:0)

如果我是你,我会使用托管应用程序配置将一组自定义首选项推送到应用程序,并使用它来提供可以下载客户端证书的URL。在第一次请求后在服务器上删除它。