我在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);
答案 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例外。
这意味着两件事:
第二步非常重要。根据我的理解,2016年之后的,您将无法提交包含SHA-1 ATS例外的应用的新版本。