我正在尝试执行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方法每次都被调用?
答案 0 :(得分:10)
上面的答案并没有解决实际问题。这里的实际问题是,只有在应用程序打开时第一次为该URL建立连接时才会显示身份验证质询。
正如here
所解释的那样TLS会话是处理器密集型的,Apple不希望您在每次与该URL建立连接时创建新的会话,因此它们会为您缓存一个。在这种情况下,它会对你起作用,但你应该能够通过包含“。”来解决这个问题。主持人结束时的角色。
在我们的案例中,我们尝试建立与包含内部CA颁发的证书的Web服务器的连接。由于我们知道在第一次连接时不会信任CA,因此我们允许连接继续以便可以下载CA.在那个连接期间,我们添加“。”字符到主机的末尾。所有后续连接都使用不带“。”的常规URL。主持人结束时的角色。这可确保我们下载的CA证书在第一次“真正”连接时得到验证。
答案 1 :(得分:1)
我通过添加以下代码解决了这个问题:
- (void)connection:(NSURLConnection *)connection
didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
[[challenge sender] cancelAuthenticationChallenge:challenge];
}
以上取消了身份验证质询,因此每次都会调用委托者canAuthenticateAgainstProtectionSpace