如何通过iOS客户端证书身份验证进行HTTP请求

时间:2020-06-27 23:06:09

标签: ios swift authentication ssl client-certificates

使用Swift为iOS应用执行HTTP GET请求时,我收到“此应用需要有效的客户端证书”消息。我正在使用iPad iOS 13进行测试,并且在打开Safari时出现一个弹出窗口来选择客户端证书,服务器成功进行身份验证。

我首先尝试使用 WKWebView ,并通过遵循Apple的开发人员文档和论坛来实现身份验证方法为 NSURLAuthenticationMethodClientCertificate 类型的情况:

optional func webView(_ webView: WKWebView, 
           didReceive challenge: URLAuthenticationChallenge, 
    completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void)

但是在检索到专有名称后,我查询了一个身份,因此我可以创建凭据,但找不到。我认为这主要是因为可以从Safari和Mail等Apple应用程序访问客户端证书,而不能从我的iOS应用程序访问客户端证书。

然后我尝试使用 SFSafariViewController ,但在得知用户通过客户端证书进行身份验证后,我看不到网站的数据。这来自Apple的文档:

您的应用看不到用户的活动和与 SFSafariViewController 的交互,无法访问自动填充数据,浏览历史记录或网站数据。

因此,使用此选项,我无法将请求数据传输回iOS应用。

最后,我尝试使用https://developer.apple.com/documentation/authenticationservices/authenticating_a_user_through_a_web_service使用 ASWebAuthenticationSession 。这将打开Safari,用户可以选择其证书,然后Web服务器进行身份验证。我在iOS应用程序上获得了成功的回调URL,并且Safari视图自动被关闭。会话开始后,我使用以下命令打开URL:

UIApplication.shared.open(url, options: [:], completionHandler: nil)

它使用Safari打开指定的URL,而无需再次验证用户身份。这告诉我 ASWebAuthenticationSession 成功。但是,我无法将此数据发送回iOS应用程序。使用 URLSession 进行HTTP请求时,我收到一条消息,提示它需要有效的证书。

我希望iOS应用程序中有一种方法可以提示用户输入客户端证书(可以使用Safari),然后可以在Web服务器上对用户进行身份验证后执行HTTP请求。有没有一种方法可以在钥匙串中不导入.p12文件的情况下实现?任何建议,将不胜感激。谢谢!

0 个答案:

没有答案
相关问题