当前位置: 首页 > news >正文

Android OkHttp 连接 HTTPS 抛出 SSL 握手异常信任链如何解决

遇到 OkHttp 报 SSL 握手异常,最稳妥的办法是修复服务器证书链,如果是内部测试环境,则通过 Network Security Config 显式信任特定 CA,不要直接在代码里关闭验证。

先说结论:生产环境必须修复服务端证书,测试环境可通过配置文件信任自签名 CA,严禁使用 TrustAllManager 绕过验证。

  • 先确认:检查证书是否过期、域名是否匹配、中间证书是否缺失
  • 先处理:优先配置 network_security_config.xml,其次才考虑自定义 TrustManager
  • 再验证:通过日志确认握手成功,并使用外部工具测试链路完整性

快速处理思路

Android 7.0 以后默认不再信任用户安装的 CA 证书,需要在资源文件中显式声明。以下是信任特定域名的自签名证书配置片段:

<network-security-config><domain-config cleartextTrafficPermitted="false"><domain includeSubdomains="true">example.com</domain><trust-anchors><certificates src="@raw/my_cert"/></trust-anchors></domain-config>
</network-security-config>

将 CA 证书放入 res/raw 并在配置中引用即可。

为什么会这样

SSL 握手异常通常意味着客户端无法验证服务端证书的有效性。OkHttp 依赖 Android 系统的 TrustManager 进行验证。从 Android 7.0 开始,为了安全,系统默认只信任系统预装的 CA,不再信任用户手动安装的证书,除非应用在配置中明确声明。

另外,如果服务端证书链不完整(缺少中间证书),桌面浏览器可能自动补全,但移动端 OkHttp 会直接报错。

分步处理

1. 检查证书状态:使用浏览器访问 HTTPS 链接,查看证书详情,确认有效期和颁发者。推荐使用 OpenSSL 命令检查链路完整性:

openssl s_client -connect your-domain.com:443 -showcerts

观察输出中是否有完整的证书链(Certificate chain),确认没有报错。

2. 导出证书:如果是自签名或内部 CA,需将根证书导出为 .cer.pem 格式。

  • 浏览器导出:点击地址栏锁图标 -> 证书 -> 详情 -> 导出,选择 DER 编码或 Base64 编码均可。
  • OpenSSL 导出:从上述命令输出中复制 ---`--BEGIN` CERTIFICATE--------`--END` CERTIFICATE----- 之间的内容保存为文件。

将导出文件重命名为 my_cert.cer 放入项目的 res/raw 目录(注意文件名只能小写字母和下划线)。

3. 编写配置文件:在 res/xml 创建 network_security_config.xml,使用 <trust-anchors> 标签引用刚才放入的证书。

4. 关联 Manifest:在 AndroidManifest.xml<application> 标签中添加 android:networkSecurityConfig="@xml/network_security_config"

5. OkHttp 配置:配置好系统级信任后,OkHttp 默认客户端即可正常工作。示例代码如下:

// Java 示例
OkHttpClient client = new OkHttpClient.Builder().build();
Request request = new Request.Builder().url("https://example.com").build();
Response response = client.newCall(request).execute();// Kotlin 示例
val client = OkHttpClient.Builder().build()
val request = Request.Builder().url("https://example.com").build()
val response = client.newCall(request).execute()

无需额外自定义 SSLSocketFactory,除非需要证书锁定(Certificate Pinning)。

怎么验证是否生效

运行应用并触发网络请求,观察 Logcat 日志。如果不再抛出 SSLHandshakeExceptionCertificateException,且业务数据正常返回,则说明握手成功。

可以在服务端或同网络环境下使用 curl 测试证书链是否完整:

curl -v https://your-domain.com

常见坑

1. TrustAllManager 风险:网上很多示例代码会教你就写一个信任所有证书的 TrustManager,这在生产环境是严重安全漏洞,容易被中间人攻击,绝对不要上线。

2. 证书锁定过期:如果使用了 Certificate Pinning,务必设置 expiration 时间,并在证书轮换前提前更新应用,否则会导致所有用户无法联网。

3. Android 版本差异:Android 9 以上对 cleartext traffic 限制更严,同时 API 级别不同可能影响 TLS 版本支持,建议 targetSdkVersion 保持更新。

4. 文件名规范res/raw 下的证书文件必须小写字母、数字或下划线,不能有大写或中划线,否则编译报错。

参考来源

  • Android Developers: Network security configuration - https://developer.android.com/training/articles/security-config
  • Square OkHttp: SSL - https://square.github.io/okhttp/ssl/

原文链接:https://www.zjcp.cc/ask/11712.html

http://www.jsqmd.com/news/860711/

相关文章:

  • 2026年沛纳海售后测评:全国50大网点收费标准与服务全盘点 - 资讯纵览
  • 2026年UPS不间断电源厂家哪家强?从需求分析到验收维保的标准化操作手册 - 资讯纵览
  • 灯塔口碑好的养发馆品牌推荐?黑奥秘AI智能检测设备,改善效果可视化 - 美业信息观察
  • 猫抓Cat-Catch:浏览器视频下载与资源嗅探的终极解决方案
  • AMD Ryzen SMU Debug Tool完整指南:轻松掌握硬件级调试的5个关键步骤
  • Python初学者项目练习26--计算列表数字的和(内附列表操作总结)
  • Java智能地址解析终极指南:企业级架构设计与高性能实现方案
  • 扎带哪家好?工业扎带源头工厂认准浙江英得特,17 年深耕配线器材行业实力领跑 - 星城方舟
  • 深度探索C++对象模型 学习笔记 第五章 构造、解构、拷贝语意学(1)
  • 2026金属加工液流量开关、流量传感器排行榜:苏州贝特凭军工标准稳居榜首 - 资讯纵览
  • 【卷卷观察】Google I/O 炸场背后:AI 行业正在经历一场“越南战争“
  • 2026年一键生成论文工具实测排行,哪款真正适合顺利通关?
  • 臻品汇-甘孜州仁启方矩创新科技客服咨询AI流量赋能,重塑智能体验新标杆腾飞 - 资讯纵览
  • QueryExcel:Excel批量查询终极指南,5分钟搞定100个文件搜索难题
  • 基于STM32的温室大棚智能监控与无线调控系统设计
  • Harness怎样帮助大模型实现稳定落地?AI Agent开发过程的系统性工程化运行时环境与约束体系(附代码)
  • 2026 最新广西空压机源头厂家 TOP10 权威测评 - 资讯纵览
  • 南宁装修公司怎么选 金空间装饰谈透明化整装趋势 - 资讯纵览
  • 2026年外墙彩涂卷厂家深度测评:如何为建筑外墙匹配最佳方案? - 资讯纵览
  • LLamaEmbedder 为什么不准?(核心原因)
  • 有限元法分析不规则物体的称重质量
  • VSCC认证常见问题解答(2026最新专家版) - 资讯纵览
  • 5分钟快速激活Adobe全家桶:Adobe-GenP通用补丁终极指南
  • 搭建美妆小程序,纯展示产品类型的,怎样做更适合中小商家?
  • ESP8266连阿里云MQTT全攻略
  • 2026年上海装修公司专业测评:7维评估模型+15个在建工地实勘的硬核结论 - 优家闲谈
  • 【深度解析】执行律师:一文读懂定义、职责与核心实践 - 资讯纵览
  • 2026执行律师推荐:全国优质执行律师事务所解析,疑难执行领域头部服务商推荐 - 资讯纵览
  • 2026年上海装修公司避坑指南:暗访25个工地+回访300位业主,筛出真正靠谱的8家 - 优家闲谈
  • UVA11955 Binomial Theorem 题解