文档中心
OKHttp閰嶇疆HTTPS璇佷功鍏ㄦ敾鐣ヤ粠闆跺紑濮嬫瀯寤哄畨鍏ㄩ€氫俊闃茬嚎
时间 : 2025-09-27 16:28:11浏览量 : 3

在移动开发中,网络请求的安全性是重中之重。如果你的App通过HTTP明文传输数据,就像用明信片寄送银行密码——任何人都能中途偷看。而HTTPS通过加密和证书验证解决了这个问题。今天,我们就以OKHttp为例,手把手教你如何正确配置HTTPS证书,堵住潜在的安全漏洞。
一、为什么HTTPS证书配置如此重要?
想象一下这个场景:用户在你的电商App里输入信用卡号下单,如果网络请求被黑客劫持(比如通过公共WiFi),数据可能直接被窃取。HTTPS的证书验证就像一位“门卫”,它会检查:
1. 身份真实性:对方服务器是不是你真正要访问的(比如`api.yourbank.com`)?
2. 数据加密:传输内容是否被AES等算法加密?
如果跳过证书验证(比如某些开发者图省事直接`trustAllCerts`),相当于告诉门卫“不用查身份证了”,中间人攻击(MITM)风险陡增。
二、OKHttp配置HTTPS证书的3种方式
方式1:信任系统默认证书(最简单)
```kotlin
val client = OkHttpClient.Builder().build()
```
这种方式默认信任Android/iOS系统的内置CA证书(如DigiCert、Let's Encrypt)。适合访问正规网站的API,但无法防御自定义证书的中间人攻击。
风险举例:黑客如果伪造了一个由系统信任的CA签发的假证书(如某些企业监控软件),你的请求仍会被劫持。
方式2:自定义信任特定证书(推荐)
将你的服务器证书(`.crt`或`.pem`文件)打包到App资产目录,然后这样配置:
val certificate = context.assets.open("your_cert.crt")
.use { it.readBytes() }
.let { CertificateFactory.getInstance("X.509")
.generateCertificate(ByteArrayInputStream(it)) }
val keyStore = KeyStore.getInstance(KeyStore.getDefaultType()).apply {
load(null, null)
setCertificateEntry("server", certificate)
}
val trustManagerFactory = TrustManagerFactory
.getInstance(TrustManagerFactory.getDefaultAlgorithm()).apply {
init(keyStore)
}
val client = OkHttpClient.Builder()
.sslSocketFactory(
SSLContext.getInstance("TLS").apply {
init(null, trustManagerFactory.trustManagers, null)
}.socketFactory,
trustManagerFactory.trustManagers[0] as X509TrustManager
)
.build()
优势:只信任你指定的证书,连正规CA签发的假证书也不认。
适用场景:金融、医疗等高安全需求App。
方式3:域名校验强化(防DNS劫持)
即使有了证书验证,还需防止黑客用其他合法证书冒充你的域名:
.hostnameVerifier { hostname, session ->
HttpsURLConnection.getDefaultHostnameVerifier()
.verify("api.your-real-domain.com", session)
这样即使攻击者持有合法但域名不匹配的证书(比如`api.fake-domain.com`),连接也会被拒绝。
三、常见踩坑与解决方案
问题1:自签名证书报错
自签证书没有CA机构背书,默认会被拒绝。解决方案:
- 开发环境临时方案:用`TrustAllCerts`+仅Debug模式启用。
- 生产环境正确做法:将自签证书内置到App中(参考方式2)。
问题2:Android7+抓包失败
由于Android Nougat开始不再信任用户安装的CA根证书,导致Charles/Fiddler无法抓包。需在App的Network Security Config中添加:
```xml
四、高级技巧:Certificate Pinning(证书钉扎)
极端安全需求下,可以连CA都不信,直接锁定证书指纹:
.certificatePinner(CertificatePinner.Builder()
.add("api.yourdomain.com", "sha256/YourCertificateFingerprintHere")
.build())
即使黑客攻破了CA机构,也无法伪造指纹匹配的证书。
五、 checklist
? 普通场景:系统默认CA + 域名校验
? 高安全场景:内置特定证书 + Certificate Pinning
? 永远不要做:生产环境使用`TrustAllCerts`
安全没有银弹,但合理的HTTPS配置能让你的App从“裸奔”变成“穿防弹衣”。现在就去检查你的OKHttpClient吧!
TAG:okhttp配置https证书,okhttp发送https,okhttp 详解,okhttp 证书,okhttp3版本,okhttp入门