繁体   English   中英

iOS canAuthenticateAgainstProtectionSpace方法每次都不会调用

[英]iOS canAuthenticateAgainstProtectionSpace method not called every time

我正在尝试执行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建立连接时才会显示身份验证质询。

正如解释这里

TLS会话是处理器密集型的,Apple不希望您在每次与该URL建立连接时创建新的会话,因此它们会为您缓存一个。 在这种情况下,它会对你起作用,但你应该能够通过包含“。”来解决这个问题。 主持人结束时的角色。

在我们的例子中,我们尝试建立与包含由内部CA颁发的证书的Web服务器的连接。 由于我们知道在第一次连接时不会信任CA,因此我们允许连接继续以便可以下载CA. 在那个连接期间,我们添加“。” 字符到主机的末尾。 所有后续连接都使用不带“。”的常规URL。 主持人结束时的角色。 这可确保我们下载的CA证书在第一次进行“真正”连接时得到验证。

我通过添加以下代码解决了这个问题:

- (void)connection:(NSURLConnection *)connection
didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
 [[challenge sender] cancelAuthenticationChallenge:challenge];
}   

以上取消了身份验证挑战,因此每次都会调用委托者canAuthenticateAgainstProtectionSpace

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM