我将从有关我们应用程序的一些背景信息开始:
我们的 iOS 应用程序连接到网络服务,在大多数情况下(除了少数列入白名单的 IP)需要身份验证。因为这个系统应该非常安全,所以公司选择使用客户端证书来允许访问服务器。每个用户都将获得一个证书,该证书根据他们是使用应用程序还是 Web 界面生成,他们必须自行下载和安装。
应用程序中的系统就是这样;用户将尝试连接到网络服务。初始的“内部”基础 url 将失败,因为他们无权访问它,因此基础 url 将更改为需要证书的 url。当用户没有安装证书时,有一个过程允许用户根据他们收到的二维码下载他的证书。然后证书将安装在应用程序中,用户可以自由访问网络服务并使用应用程序。
这个系统有效,但它需要很多操作。
现在到现在:
我们想让用户使用起来更轻松,而使用该应用程序的公司希望拥有更多控制权。基本上,正在制定一个系统,允许公司创建自己的证书,并且他们希望使用一些管理工具来分发它。不深入细节,情况是所需的证书将安装到 iOS 本身,而不是在应用程序中。
这就是问题所在,我似乎无法从应用程序中访问已安装的证书,并不断收到 401 错误。
我做了一些研究来启动它,我最初的 react 是“这行不通”,正如官方开发者页面的这一页所说:
但是因为我们想要 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 值:
- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace;
{
return YES;
}
- (BOOL)connectionShouldUseCredentialStorage:(NSURLConnection *)connection;
{
return YES;
}
为了在应用程序本身之外做一些进一步的检查,我查看了我们这里的 iPad。它为网站安装了证书(与应用程序的权限不同),在 Safari 上我可以访问受证书保护的网站。但是,在 Chrome 和 Firefox 上,我会错误地指出该网站需要证书。因此,这让我相信,除非您基本上是 Apple 应用程序,否则确实不可能访问这些证书。
所以基本上,我对这个问题束手无策。这个问题的简短版本: 我可以从我的应用程序访问 iPhone 上安装的客户端证书以访问需要此证书的网络服务吗?
如果是,长版: 怎么做?
最佳答案
如果我是你,我会使用托管应用程序配置将一组自定义首选项推送到应用程序,并使用它来提供可以下载客户端证书的 URL。在第一次请求后在服务器上删除它。
关于ios - 从应用程序内访问已安装的配置文件/证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39528491/