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

标签 ios web-services ssl ssl-certificate nsurlconnection

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

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

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

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

现在到现在:

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

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

我做了一些研究来启动它,我最初的 react 是“这行不通”,正如官方开发者页面的这一页所说:

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 值:

- (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/

相关文章:

java - 使用java代码从soap服务中提取数据

android - API 请求被 burp 套件拦截

ios - 将我的 YouTube channel 获取(获取)到我的 iOS 应用程序中

java - 为什么以及何时使用基于 EJB 的 Web 服务?

ios - 以编程方式为自定义UIViewController设置 Storyboard ID?

web-services - 我应该在 URL 中提供父资源名称,还是在 RESTful WS 中不提供?

SSL : Unable to load certificate

security - 什么是有效的 SSL 证书通用名称?

ios - 托管对象上下文作为单例?

ios - 在 ios 9 上登录 Facebook 后必须点击 "Done"按钮