在ServerTrust之后,'didReceiveChallenge'没有被要求进行HttpBasic身份验证

时间:2017-01-01 17:44:56

标签: ios nsurlconnection nsurlsession

我正在将iOS应用程序从NSURLConnection转换为NSURLSession。

服务器与之交互使用https(由认可的CA签名的证书)和基本身份验证。

我没有使用完成块来进行数据返回,而是使用自定义委托。我在其他地方看到,使用自定义委托意味着我应该响应AuthenticationChallenges而不是依赖于CredentialStorage(不是那个也可以,但那是另一个问题)。

我的问题是,针对ServerTrust的挑战发生一次,但是不会再次调用HttpBasic身份验证。所以,我的会议超时了。

我尝试使用'defaultSession dataTaskWithRequest'的完成块而不是自定义委托,只是为了看看我是否可以超越这一点,但它没有任何区别。我也尝试将CredentialStorage用于HttpBasic凭证,但如上所述,没有任何乐趣。

这让我很难过。有什么想法吗?

Runnable

1 个答案:

答案 0 :(得分:4)

没有特别的顺序:

  • 您已经有效地完全禁用了相关主机的TLS,因为您没有以任何有意义的方式检查证书,只是检查它是否提供了与给定主机名匹配的证书。这非常非常危险。相反,您需要在证书上执行一些自定义验证(例如,检查密钥是否与固定密钥相匹配,或检查它是否由已知信任的内部证书签名),然后执行您只能执行的操作。它有效。
  • 您已经(我认为)通过指定您不希望服务器提供其证书来有效地完全破坏所有其他主机的TLS。在这种情况下,你应该要求默认处理。
  • 对于任何其他挑战类型,您的方法忽略了挑战,这意味着连接将永远挂起并且永远不会取得进展。在这些情况下,您应该要求默认处理。否则,当(不是)您被要求提供客户端证书时,您的连接似乎会挂起并最终会暂停。
  • 您正在处理错误的实际通知。您应该从不使用NSURLSession在挑战发件人上调用方法。您必须调用完成方法。否则,会话将继续等待您调用它,直到请求超时。

我不确定代码中是否还有其他错误,但这三个错误都可能导致严重的不当行为,其中一个是一个主要的安全漏洞。首先修复这些问题,如果仍然无法解决问题,请添加更多评论。 : - )