NSURLSession中不受信任的证书错误,无法在iOS 10中使用自定义协议

时间:2016-09-19 11:21:45

标签: ssl proxy uiwebview nsurlsession ios10

我在NSURLProtocol中使用NSURLSession来捕获一些流量并通过UIWebView的代理引导它。当我浏览具有无效证书的HTTPS站点时,UIWebView失败并显示:

  

错误域= NSURLErrorDomain代码= -1202"此服务器的证书无效。您可能正在连接到假装为“revoked.grc.com”的服务器,这可能会使您的机密信息面临风险。" UserInfo = {NSURLErrorFailingURLPeerTrustErrorKey =,NSLocalizedRecoverySuggestion =你想要连接到服务器吗?,NSErrorFailingURLKey =,NSErrorFailingURLStringKey =,NSErrorPeerCertificateChainKey =(       "&#34 ;,       ""   ),NSErrorClientCertificateStateKey = 0,NSLocalizedDescription =此服务器的证书无效。您可能正在连接到假装为“revoked.grc.com”的服务器,这可能会使您的机密信息面临风险。,_ kCFStreamErrorDomainKey = 3,NSUnderlyingError = 0x170255420 {错误域= kCFErrorDomainCFNetwork代码= -1202"(空)" UserInfo = {_ kCFStreamPropertySSLClientCertificateState = 0,kCFStreamPropertySSLPeerTrust =,_ kCFNetworkCFStreamSSLErrorOriginalValue = -9807,_kCFStreamErrorDomainKey = 3,_kCFStreamErrorCodeKey = -9807,kCFStreamPropertySSLPeerCertificates =(       "&#34 ;,       ""   )},_ kCFStreamErrorCodeKey = -9807}

在iOS 9及更低版本中,但在iOS 10中,它会出现以下错误:

  

错误域= kCFErrorDomainCFNetwork代码= 310"与安全Web代理服务器(HTTPS)通信时出现问题。" UserInfo = {NSErrorFailingURLStringKey =,NSErrorFailingURLKey =,_ kCFStreamErrorCodeKey = -2096,_kCFStreamErrorDomainKey = 4,NSLocalizedRecoverySuggestion =请检查您的代理设置。有关此问题的帮助,请与系统管理员联系。,NSLocalizedDescription =与安全Web代理服务器(HTTPS)通信时出现问题。}

所以在iOS 10中,我无法弄清楚通过代理的不受信任的网站的方式。如果我在NSURLProtocol(即NSURLSession)中浏览具有无代理证书的无效证书的网站,那么它在iOS 10中也能正常工作。

didReceiveChallenge委托方法的实现。

AppDelegate *appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate; if([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]){ SecTrustRef trust = [[challenge protectionSpace] serverTrust]; SecCertificateRef cert = SecTrustGetCertificateAtIndex(trust, 0); if ([[appDelegate certStore] containsCertificate:cert]) { completionHandler(NSURLSessionAuthChallengeUseCredential,[NSURLCredential credentialForTrust:trust]); return; } } completionHandler(NSURLSessionAuthChallengePerformDefaultHandling, nil);

2 个答案:

答案 0 :(得分:2)

如果基础请求通过iOS 10上的代理访问证书,您将收到错误代码310。这意味着发送 HTTP 请求获取证书并不安全通过代理。当iOS需要获取或更新中间证书时,会发生这种情况,独立流程securityd会发出请求。

您应该通过以下方式使证书请求无代理:

  • 暂时关闭代理
  • 或标记任何请求以.crt不使用代理
  • 结束

然后你应该得到正确的证书,代码将继续运行。

答案 1 :(得分:0)

如果我使用openssl s_client连接到该主机,请将证书复制到文件中,然后运行openssl x509 -in cert.crt -text -noout,我会看到:

Signature Algorithm: sha1WithRSAEncryption

在iOS 10中不推荐支持SHA-1证书,并且需要App Transport Security例外。

这意味着两件事:

  • 您应该暂时添加ATS例外,以便让您的应用再次投放。
  • 必须将该证书替换为不尽快使用SHA-1签名的证书。

第二步非常重要。根据我的理解,2016年之后的,您将无法提交包含SHA-1 ATS例外的应用的新版本。