我正在尝试执行SSL证书验证并已实现委托canAuthenticateAgainstProtectionSpace
- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace: (NSURLProtectionSpace*)protectionSpace { OSStatus status = SecTrustEvaluate(protectionSpace.serverTrust,&trustResult); if(status == errSecSuccess) { } else { } }
但是,我注意到第一次为给定的URL调用此委托,但不会针对同一URL的后续尝试进行调用.我认为这与缓存的响应有关,所以我创建了NSURLRequest,如下所示:
NSURLRequest *request = [[NSURLRequest alloc] initWithURL: [NSURL URLWithString:_urlString] cachePolicy: NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval: 10 ]; NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
这也无济于事.任何想法,我怎么能得到canAuthenticateAgainstProtectionSpace方法每次都能得到调用?
解决方法
上面的答案并没有解决实际问题.这里的实际问题是,只有在应用程序打开时第一次为该URL建立连接时才会显示身份验证质询.
如here所述
TLS会话是处理器密集型的,Apple不希望您在每次与该URL建立连接时创建新的会话,因此它们会为您缓存一个.在这种情况下,它会对你起作用,但你应该能够通过包含“.”来解决这个问题.主持人结束时的角色.
在我们的例子中,我们尝试建立与包含由内部CA颁发的证书的Web服务器的连接.由于我们知道在第一次连接时不会信任CA,因此我们允许连接继续以便可以下载CA.在那个连接期间,我们添加“.”字符到主机的末尾.所有后续连接都使用不带“.”的常规URL.主持人结束时的角色.这可确保我们下载的CA证书在第一次进行“真正”连接时得到验证.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。