文档中心
RetrofitSSL璇佷功閰嶇疆鍏ㄦ寚鍗楀浣曢伩鍏岮ndroid搴旂敤涓殑涓棿浜烘敾鍑伙紵
时间 : 2025-09-27 16:32:20浏览量 : 4

在移动应用开发中,网络安全是重中之重。如果你使用Retrofit作为网络请求库,配置SSL证书是防止中间人攻击(MITM)的关键步骤。本文将通过通俗易懂的示例,带你彻底搞懂Retrofit SSL证书的配置原理和实战方法。
一、为什么需要SSL证书?
想象一下:你通过公共WiFi登录银行APP,黑客在同一个网络下,用工具截获了你的账号密码——这就是典型的中间人攻击。SSL证书的作用就像“加密信封”,确保数据在传输过程中无法被窃听或篡改。
示例场景:
- 不安全的HTTP请求:数据像明信片一样公开传递。
- 启用HTTPS+SSL证书:数据变成密封的信件,只有收件人(服务器)能打开。
二、Retrofit中SSL证书的三种配置方式
1. 信任所有证书(仅限测试环境!)
```kotlin
val unsafeOkHttpClient = OkHttpClient.Builder()
.sslSocketFactory(createUnsafeSSLSocketFactory(), trustAllCerts[0])
.hostnameVerifier { _, _ -> true } // 跳过域名验证
.build()
val retrofit = Retrofit.Builder()
.client(unsafeOkHttpClient)
```
?? 危险警告:这种方式会接受任何无效/伪造的证书,相当于拆掉了锁门的安全锁。仅用于调试!
2. 使用系统默认信任库(推荐基础方案)
Android默认信任主流CA机构(如DigiCert、Let's Encrypt)颁发的证书:
val okHttpClient = OkHttpClient.Builder()
.build() // 无需额外配置,自动校验可信CA
? 适用场景:你的服务器使用正规CA签发的证书(比如阿里云/腾讯云购买的SSL证书)。
3. 自定义证书校验(高安全需求)
当使用自签名证书或私有CA时,需手动加载证书:
// 步骤1:将.crt文件放在assets文件夹
val certificateFactory = CertificateFactory.getInstance("X.509")
val inputStream = context.assets.open("my_cert.crt")
val certificate = certificateFactory.generateCertificate(inputStream)
// 步骤2:创建专属TrustManager
val keyStore = KeyStore.getInstance(KeyStore.getDefaultType())
keyStore.load(null)
keyStore.setCertificateEntry("ca", certificate)
val trustManagerFactory = TrustManagerFactory
.getInstance(TrustManagerFactory.getDefaultAlgorithm())
trustManagerFactory.init(keyStore)
// 步骤3:应用到Retrofit
val sslContext = SSLContext.getInstance("TLS")
sslContext.init(null, trustManagerFactory.trustManagers, null)
.sslSocketFactory(sslContext.socketFactory, trustManagerFactory.trustManagers[0] as X509TrustManager)
?? 安全升级:这种方式只信任你指定的证书,连黑客伪造的“可信CA”也无法通过验证。
三、常见问题与解决方案
问题1:CertificateException: Unable to validate certificate chain
原因:服务器缺少中间CA证书。
修复方法:
- 使用OpenSSL检查完整链:`openssl s_client -connect yourdomain.com:443 -showcerts`
- 确保服务器返回完整的证书链(包含根CA和中间CA)。
问题2:Cleartext HTTP traffic not permitted
原因:Android 9+默认禁用HTTP明文传输。
解决方案:
- 方案A:改用HTTPS
- 方案B(临时):在`AndroidManifest.xml`中添加:
```xml
四、进阶技巧:Certificate Pinning(证书钉扎)
即使黑客攻破了CA机构,也无法伪造你的证书:
val pinningClient = OkHttpClient.Builder()
.certificatePinner(
CertificatePinner.Builder()
.add("yourdomain.com", "sha256/YourPublicKeyHash...")
.build()
)
?? 工作原理:提前存储服务器公钥的哈希值,每次请求对比是否匹配。
五、 Checklist
1. ? 生产环境永远不要使用`trustAllCerts`
2. ? 优先选择可信CA颁发的标准证书
3. ? 自签名证书需严格绑定到客户端
4. ? Android 9+必须使用HTTPS
通过正确配置Retrofit SSL证书,你能有效防范流量劫持、数据泄露等风险。现在就去检查你的App是否做好了这些防护吧!
TAG:retrofit ssl证书,ssl证书使用教程,sslcertificatechainfile,ssl_trusted_certificate