文档中心
Retrofit涓璈TTPS璇佷功楠岃瘉鍏ㄨВ鏋愪粠鍘熺悊鍒板疄鎴橀槻鎶撳寘
时间 : 2025-09-27 16:32:21浏览量 : 2
一、为什么HTTPS证书在Retrofit中如此重要?

想象一下你寄快递:HTTP就像用透明塑料袋包装货物,谁都能看到内容;HTTPS则是加了密码锁的保险箱。而证书就是这把锁的“身份证”,用来验证对方是不是真正的快递站(服务器)。如果忽略证书验证,黑客可以伪造一个假快递站(中间人攻击),你的银行卡号、密码等数据就会被窃取。
真实案例:
2025年某金融APP因未校验HTTPS证书,黑客通过公共WiFi拦截用户请求,篡改转账金额。而使用Retrofit时,默认会校验系统信任的证书(如Let's Encrypt、DigiCert等),但遇到自签名证书或特殊场景时需手动处理。
二、Retrofit处理HTTPS证书的3种核心方法
1. 信任所有证书(危险!仅限测试)
```kotlin
val unsafeOkHttpClient = OkHttpClient.Builder()
.sslSocketFactory(createUnsafeSSLSocketFactory(), trustAllCerts[0])
.hostnameVerifier { _, _ -> true } // 连域名都不校验
.build()
val retrofit = Retrofit.Builder()
.client(unsafeOkHttpClient)
```
?? 风险:相当于把保险箱密码设为“123456”,适用于快速测试API,但绝对禁止上线!
2. 自定义信任特定证书(推荐自签名场景)
比如公司内网使用自签名证书:
// 加载放在assets目录的证书
val certStream = context.assets.open("my_company.crt")
val certificate = CertificateFactory.getInstance("X.509")
.generateCertificate(certStream)
// 创建专属信任库
val keyStore = KeyStore.getInstance(KeyStore.getDefaultType()).apply {
load(null, null)
setCertificateEntry("company", certificate)
}
// 构建只信任该证书的OkHttpClient
val sslContext = SSLContext.getInstance("TLS").apply {
init(null, TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm())
.apply { init(keyStore) }.trustManagers, null)
.client(OkHttpClient.Builder()
.sslSocketFactory(sslContext.socketFactory, trustAllCerts[0])
.build())
?? 优势:即使黑客伪造证书也无法通过验证。
3. 公钥锁定(Certificate Pinning)
最严格的安全策略,直接比对服务器公钥指纹:
val pinningClient = OkHttpClient.Builder()
.certificatePinner(CertificatePinner.Builder()
.add("api.yourbank.com", "sha256/你的公钥指纹...")
?? 适用场景:银行类APP。连正规CA颁发的其他证书也不信任,只认自己预置的公钥。
三、常见问题与解决方案
Q1: 报错`SSLHandshakeException`怎么办?
- 可能原因1:服务器证书过期
检查浏览器访问是否同样报错,联系服务端更新。
- 可能原因2:Android旧版本不识别新CA根证书
解决方案:
```kotlin
// 手动添加现代CA根证书(如Let's Encrypt的ISRG Root X1)
val trustedCertificates = listOf(
... // 加载ISRG等额外根证
)
```
Q2: Charles/Fiddler抓包工具无法抓HTTPS?
这是因为抓包工具会生成自己的CA证书。调试时可临时添加代码:
.hostnameVerifier { hostname, session ->
hostname == "api.yourdev.com" // 仅调试环境放行
记得用`BuildConfig.DEBUG`区分开发/生产环境!
四、最佳安全实践 checklist
1. 【必须】生产环境禁用`trustAllCerts`
2. 【推荐】使用Certificate Pinning(注意预留备用密钥)
3. 【可选】定期更新预置证书列表(应对CA吊销事件)
4. 【监控】集成Firebase Crashlytics捕获SSL相关异常
> ?? 延伸知识:Android7+开始默认不信任用户安装的CA证书(网络安全配置机制),防止恶意软件监控流量。
通过合理配置Retrofit的HTTPS策略,你的APP将像穿上防弹衣一样安全!
TAG:retrofit https证书,retrofit baseurl,crossfit level1证书,crossfit 证书

