ssl新闻资讯

文档中心

OKHttp閰嶇疆HTTPS璇佷功鍏ㄦ敾鐣ヤ粠闆跺紑濮嬫瀯寤哄畨鍏ㄩ€氫俊闃茬嚎

时间 : 2025-09-27 16:28:11浏览量 : 3

2OKHttp閰嶇疆HTTPS璇佷功鍏ㄦ敾鐣ヤ粠闆跺紑濮嬫瀯寤哄畨鍏ㄩ€氫俊闃茬嚎

在移动开发中,网络请求的安全性是重中之重。如果你的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入门