1. 当HTTPS握手失败时发生了什么?
第一次看到"Hostname not verified"这个错误时,我正对接一个第三方支付接口。控制台突然弹出的红色错误让我心头一紧——明明昨天测试还一切正常。这种错误在Android开发中太常见了,特别是在使用OKHttp进行HTTPS通信时。
这个错误的本质是SSL/TLS握手过程中的主机名验证失败。想象一下你去银行办理业务,柜员要求你出示身份证。如果你递上的身份证姓名与银行系统记录不符,业务就无法继续。HTTPS的证书验证也是类似的道理——客户端会检查服务器证书中的域名是否与请求的URL匹配。
典型的错误信息长这样:
code复制Hostname not verified: certificate: sha256/F0yVXJ...
DN: CN=*.xxx.com, O=*有限公司
subjectAltNames: [*.xxx.com, xxx.com]
这段信息告诉我们三件事:
- 证书指纹(sha256那串字符)
- 证书主题(包含公司信息)
- 证书允许的域名列表(subjectAltNames)
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 深入HTTPS证书校验机制
2.1 SSL/TLS握手全流程
一次完整的HTTPS通信要经历这些步骤:
- 客户端发送"Client Hello"——相当于打招呼:"嗨,我想用TLS 1.2版本,支持这些加密套件"
- 服务器回应"Server Hello"——选择加密方式并发送证书
- 客户端验证证书有效性
- 密钥交换
- 加密通信开始
其中第三步就是常出问题的环节。OKHttp会做以下检查:
- 证书是否过期
- 证书链是否可信
- 证书中的域名是否匹配
- 证书是否被吊销
2.2 关键组件解析
在OKHttp中,两个核心类控制着验证过程:
X509TrustManager:
java复制public interface X509TrustManager {
void checkClientTrusted(X509Certificate[] chain, String authType);
void checkServerTrusted(X509Certificate[] chain, String au
