ios - NSURLConnection 的委托(delegate)方法,请求authenticationChallenge 不会被解雇?

标签 ios certificate nsurlconnection ssl-certificate nsurlconnectiondelegate

我使用 NSURLConnection 调用 Web 服务,并且我的钥匙串(keychain)中存在一个客户端证书,我将其设置为 - (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge

在我删除此证书并向钥匙串(keychain)添加一个新证书后,NSURLConnection 仍然保留我已经提供的凭据,并在我删除旧证书之前向我返回 417 状态错误代码,即 200。

有没有办法让 NSURLConnection 强制要求提供凭据?或者如何关闭现有的 SSL 连接或身份验证质询的凭据。

最佳答案

NSURLConnection 是善变的野兽,过去几天我也遇到了类似的问题。但我已经找到了解决我的问题的方法,并就您所遇到的问题的可能原因提出了一些建议。

TLS

首先,您遇到的情况可能是 TLS 层缓存了凭证。这是因为建立 TLS 连接的计算成本很高 [ 1 ].

可能的解决方案是更改您正在使用的 DNS 名称,例如在字符串末尾添加点 (.),因为 DNS 协议(protocol)接受以点结尾的字符串作为完全限定的 DNS 名称。我还看到人们向所有 URL 请求添加主题标签 (#),从而欺骗系统从不查找存储的凭据,而只是启动 didRecieveAuthenticationChallenge 调用 [ 2 ].

Cookie

另一种可能性是服务器正在设置您需要清除的 cookie。您可以通过执行以下操作来做到这一点:

-(void)clearCookies:(NSString *)urlString{
    NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedCookieStorage];
    NSURL *url = [[NSURL alloc] initWithString urlString];
    NSArray *cookies = [cookieStorage cookiesForURL:tempURL];

    for(NSHTTPCookie *cookie in cookies){
        //iterate over all cookies and delete them
        [cookieStorage deleteCookie:cookie];
    }

}

NSURLCredentialStorage

现在,凭据可能仍存储在 sharedCredentialStorage 中,因此应通过执行以下操作来删除:

NSURLCredentialStorage *store = [NSURLCredentialStorage sharedCredentialStorage];
if(store !=nil){
   for(NSURLProtectionSpace *protectionSpace in [store allCredentials]){
      NSDictionary *map = [[NSURLCredentialStorage sharedCredentialStorage] 
                                  credentialsForProtectionSpace:protectionSpace];
      if(map!=nil){
         for(NSString *user in map){
             NSURLCredential *cred = [map objectForKey:user];
             [store removeCredential:cred forProtectionSpace:protectionSpace];
          }
      }
   }
}

我希望这些能有所帮助。

关于ios - NSURLConnection 的委托(delegate)方法,请求authenticationChallenge 不会被解雇?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11448209/

相关文章:

iphone - 是否可以用图案图像填充 UIBezierPath?

iphone - 了解 AurioTouch

java - 如何在 java 中使用本地 HTTPS URL?

java - 在运行时定期更改 SSL 证书

ios - 应用程式因服务回应而当机

iphone - ASIHTTP请求问题

iphone - Time Profiler-等待应用启动

ios - swift ,parse.com : how to pass data from query

ssh - 从 SSH 服务器获取公钥

ios - 将 block 与 NSURLConnection 一起使用时,是否需要 @synchronize 访问变量?