文档中心
OKHttp蹇界暐HTTPS璇佷功鐨勯闄╀笌姝g‘瑙e喅鏂规锛堥檮瀹炴垬妗堜緥锛?txt
时间 : 2025-09-27 16:28:10浏览量 : 3
一、为什么有人想忽略HTTPS证书?

HTTPS证书是网站身份的“身份证”,浏览器通过验证证书来确认“对方是不是真的淘宝/银行”。但开发中常遇到这类场景:
- 测试环境:公司内网测试服务器用自签名证书(没有权威机构颁发),客户端不信任会报错。
- 抓包调试:用Fiddler/Charles抓包时,工具会伪造证书,导致客户端校验失败。
为了快速绕过问题,程序员可能会直接让OKHttp“无视”证书验证,比如这样写:
```java
OkHttpClient client = new OkHttpClient.Builder()
.hostnameVerifier((hostname, session) -> true) // 跳过域名验证
.sslSocketFactory(trustAllCerts, trustAllCerts[0]) // 信任所有证书
.build();
```
二、忽略证书的四大风险(真实案例)
1. 中间人攻击(MITM)
场景:用户连接公共WiFi,黑客用工具伪造银行网站证书。如果APP忽略了证书校验,用户的账号密码会被窃取。
案例:2025年某金融APP因测试代码未删除,上线后忽略证书验证,导致大量用户数据泄露。
2. 数据篡改
黑客可篡改服务器返回的数据。例如:APP请求商品价格接口,黑客拦截响应将“100元”改为“1元”。
3. 合规性问题
GDPR、等保2.0等法规要求数据传输必须加密。忽略证书可能导致法律风险。
4. 难以发现的BUG
测试环境正常,生产环境因证书问题崩溃。例如:服务器证书过期后APP无法感知,用户无法登录。
三、正确的解决方案(分场景)
场景1:测试环境自签名证书
? 方案:只信任特定自签名证书(而非所有证书)
// 1. 将测试服务器的CA证书(.crt文件)放到assets文件夹
// 2. 代码中只加载该证书
InputStream certStream = getAssets().open("my_test_ca.crt");
CertificateFactory cf = CertificateFactory.getInstance("X.509");
Certificate ca = cf.generateCertificate(certStream);
// 3. 创建KeyStore并信任该CA
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(null, null);
keyStore.setCertificateEntry("ca", ca);
// 4. 构建SSLContext
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(keyStore);
.sslSocketFactory(sslContext.getSocketFactory(), trustManager)
场景2:抓包调试(如Charles)
? 方案:仅调试时信任抓包工具的CA根证书
- 将Charles/Fiddler的CA证书安装到手机系统信任目录。
- 代码中通过`isDebug`判断是否启用严格模式:
if (BuildConfig.DEBUG) {
client = new OkHttpClient.Builder()
.sslSocketFactory(debugSocketFactory, debugTrustManager)
.build();
} else {
client = new OkHttpClient(); // 生产环境严格校验
}
四、高级防护技巧
1. Certificate Pinning(证书钉扎) :直接绑定服务器公钥哈希值,连CA颁发的假证也无效。示例:
```java
String hostname = "api.yourbank.com";
CertificatePinner pinner = new CertificatePinner.Builder()
.add(hostname, "sha256/AAAAAAAAAAAAAAAA=") // 替换为真实哈希
.build();
```
2. 网络配置隔离策略
- Release包强制校验域名和有效期。
- 监控异常日志(如大量SSL错误可能预示攻击)。
五、
| 方案 | 安全性 | 适用场景 |
||--||
| `信任所有证书` | ? | ?绝对不要用! |
| `仅信任指定CA` | ? | 测试环境 |
| `动态开关调试模式` | ? | Charles抓包 |
| `Certificate Pinning`| ?? | 高敏感金融类APP |
> ?? 黄金法则: HTTPS不是可选项——宁可让测试阶段多花1小时配证书,也别让上线后损失100万用户数据!
TAG:okhttp 忽略https证书,忽略ssl证书java,忽略ssl证书,忽略次要的ssl证书错误,resttemplate忽略证书,okhttp配置