服务器信任质询 (Challenge) - 你到底信不信任这台服务器?
NSURLSession 与 NSURLAuthenticationMethodServerTrust
—— 从零开始的“服务器信任质询”全流程
目标读者:刚接触 iOS 网络开发、准备理解 HTTPS 与证书校验细节的同学
出发点:搞清楚为什么会有“质询”、质询的触发时机、以及在 delegate 里怎么正确地处理它。
1. 质询到底是什么?
当 URLSession
发现需要某种额外凭据(credential)才能继续网络交互时,会暂停请求并向你抛出 authentication challenge。对 HTTPS 来说,最常见的触发类型就是 NSURLAuthenticationMethodServerTrust
:
-
服务器把 X.509 证书链塞进 TLS 握手。
-
客户端(iOS TLS 实现 + ATS 默认策略)检查:
- 证书是否在有效期、是否被吊销;
- 证书链是否能追溯到系统或配置的受信根 CA;
- 证书的 CN/SAN 是否与请求的 host 完全匹配。
-
如果 全部 检查都能自动通过,
URLSession
不会打扰你——直接走默认证书校验并继续请求。 -
只要 你实现了 session-level delegate 方法
urlSession(_:didReceive:completionHandler:)
,系统就会把步骤 2 的工作“交卷”给你——即使校验本来能自动通过。