从应用程序中访问已安装的配置文件/证书
Accessing installed profiles / certificates from within the app
我将从有关我们应用程序的一些背景信息开始:
我们的 iOS 应用程序连接到网络服务,在大多数情况下(除了少数列入白名单的 IP)需要身份验证。因为这个系统应该非常安全,所以公司选择使用客户端证书来允许访问服务器。每个用户都会获得一个证书,该证书根据他们是使用应用程序还是 Web 界面生成,他们必须自行下载和安装。
应用程序中的系统就是这样;用户将尝试连接到网络服务。初始基础 'internal' url 将失败,因为他们无法访问它,因此基础 url 将更改为需要证书的 url。当用户没有安装证书时,有一个过程允许用户根据他们收到的二维码下载他的证书。然后证书将安装在应用程序中,用户可以自由访问网络服务并使用应用程序。
这个系统有效,但它需要很多操作。
现在到现在:
我们想让用户更轻松,使用该应用程序的公司希望拥有更多控制权。基本上,正在制定一个系统,允许公司创建自己的证书,并且他们希望使用一些管理工具来分发它。不深入细节,情况是所需的证书将安装到 iOS 本身,而不是在应用程序中。
这就是问题所在,我似乎无法从应用程序中访问已安装的证书,并不断收到 401 错误。
我做了一些研究来启动它,我的初步反应是 "This will not work" 正如官方开发者页面的这个页面所说:
但是因为我们想 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 可以下载客户端证书的地方。第一次请求后在服务器上删除它。
我将从有关我们应用程序的一些背景信息开始:
我们的 iOS 应用程序连接到网络服务,在大多数情况下(除了少数列入白名单的 IP)需要身份验证。因为这个系统应该非常安全,所以公司选择使用客户端证书来允许访问服务器。每个用户都会获得一个证书,该证书根据他们是使用应用程序还是 Web 界面生成,他们必须自行下载和安装。
应用程序中的系统就是这样;用户将尝试连接到网络服务。初始基础 'internal' url 将失败,因为他们无法访问它,因此基础 url 将更改为需要证书的 url。当用户没有安装证书时,有一个过程允许用户根据他们收到的二维码下载他的证书。然后证书将安装在应用程序中,用户可以自由访问网络服务并使用应用程序。
这个系统有效,但它需要很多操作。
现在到现在:
我们想让用户更轻松,使用该应用程序的公司希望拥有更多控制权。基本上,正在制定一个系统,允许公司创建自己的证书,并且他们希望使用一些管理工具来分发它。不深入细节,情况是所需的证书将安装到 iOS 本身,而不是在应用程序中。
这就是问题所在,我似乎无法从应用程序中访问已安装的证书,并不断收到 401 错误。
我做了一些研究来启动它,我的初步反应是 "This will not work" 正如官方开发者页面的这个页面所说:
但是因为我们想 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 可以下载客户端证书的地方。第一次请求后在服务器上删除它。