HTTPS 比 HTTP 多了一个 TLS 握手的过程,这个过程中涉及到一个证书校验的问题,服务端会在第二次握手的时候返回一个证书,来使得客户端可以校验它的身份,避免出现假冒的状况。在这次校验过程中,会校验证书的 domain 域是否包含本次 Request 的 host,并且校验返回的证书是否是官方机构颁发的可信证书。由于 IP 连接会将 URL 中的域名置换为 IP,所以就会导致返回的证书和我们的 Request 校验失败的问题。
为了解决证书的校验的问题,我们需要在证书校验前,再进行一次域名的替换,这次需要把 URL 中 IP 置换为域名,这样证书校验的问题便可迎刃而解。
具体代码中,在NSURLSession的代理方法中,有一个验证方法,需要在其中把ip换成域名去验证
- (void)URLSession:(NSURLSession *)session
task:(NSURLSessionTask *)task
didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge
completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler {
网友评论