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

Accessing installed profiles / certificates from within the app

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

我们的 iOS 应用程序连接到网络服务,在大多数情况下(除了少数列入白名单的 IP)需要身份验证。因为这个系统应该非常安全,所以公司选择使用客户端证书来允许访问服务器。每个用户都会获得一个证书,该证书根据他们是使用应用程序还是 Web 界面生成,他们必须自行下载和安装。

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

这个系统有效,但它需要很多操作。

现在到现在:

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

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

我做了一些研究来启动它,我的初步反应是 "This will not work" 正如官方开发者页面的这个页面所说:

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 上安装的客户端证书以访问需要此证书的 Web 服务吗?

如果是,长版: 如何?

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