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

use*_*752 5 ssl proxy uiwebview nsurlsession ios10

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

错误域= NSURLErrorDomain代码= -1202"此服务器的证书无效.您可能正在连接到假装为"revoked.grc.com"的服务器,这可能会使您的机密信息面临风险." UserInfo = {NSURLErrorFailingURLPeerTrustErrorKey =,NSLocalizedRecoverySuggestion =您是否还要连接到服务器?,NSErrorFailingURLKey =,NSErrorFailingURLStringKey =,NSErrorPeerCertificateChainKey =("",""),NSErrorClientCertificateStateKey = 0,NSLocalizedDescription =此服务器的证书无效.您可能正在连接到假装为"revoked.grc.com"的服务器,这可能会使您的机密信息面临风险.,_ kCFStreamErrorDomainKey = 3,NSUnderlyingError = 0x170255420 {Error Domain = kCFErrorDomainCFNetwork Code = -1202"(null)"的UserInfo = {_ kCFStreamPropertySSLClientCertificateState = 0,kCFStreamPropertySSLPeerTrust =,_kCFNetworkCFStreamSSLErrorOriginalValue = -9807,_kCFStreamErrorDomainKey = 3,_kCFStreamErrorCodeKey = -9807,kCFStreamPropertySSLPeerCertificates =( "", "")}},_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);

dga*_*ood 0

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

Signature Algorithm: sha1WithRSAEncryption
Run Code Online (Sandbox Code Playgroud)

iOS 10 中已弃用对 SHA-1 证书的支持,并且需要应用程序传输安全例外。

这意味着两件事:

  • 您应该暂时添加 ATS 例外以使您的应用程序再次运行。
  • 必须尽快将该证书替换为不使用 SHA-1 签名的证书。

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