文档中心
Android寮€鍙戝繀鐭TTPS璇佷功楠岃瘉鐨勯偅浜涘潙涓庢渶浣冲疄璺?txt
时间 : 2025-09-27 15:40:49浏览量 : 1

在移动应用开发中,HTTPS是保护用户数据安全的基石。但很多Android开发者容易忽略一个关键环节:证书验证。如果处理不当,轻则导致中间人攻击(MitM),重则让用户隐私数据裸奔。本文用大白话+实例,带你彻底搞懂Android HTTPS证书验证的坑和正确姿势。
一、HTTPS证书验证是啥?为啥重要?
想象你叫外卖,骑手把餐送到门口时,你需要核对工作证和平台App信息,确认他是真骑手而不是骗子。HTTPS证书验证就是这个过程:
- 服务端证书 ≈ 骑手的工作证
- CA机构签名 ≈ 平台盖章认证
- 域名匹配检查 ≈ 核对订单上的骑手照片
如果跳过验证(比如代码里直接`trustAllCerts`),相当于不看证件直接开门——黑客就能伪造证书拦截你的API请求(如下图)。

*伪基站伪造银行证书盗取账号的典型案例*
二、Android证书验证的3个常见坑
1. 坑一:默认信任所有证书(开发一时爽,上线火葬场)
```java
// 危险代码!相当于把家门钥匙扔楼下
TrustManager[] trustAllCerts = new TrustManager[] {
new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] chain, String authType) {}
public void checkServerTrusted(X509Certificate[] chain, String authType) {}
public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; }
}
};
SSLContext.getInstance("SSL").init(null, trustAllCerts, null);
```
?? 后果:2025年某金融App因此被薅走百万资金,黑客用Fiddler轻松解密所有交易请求。
2. 坑二:忽略域名校验(证书对了但人不对)
HostnameVerifier allowAllHosts = (hostname, session) -> true;
HttpsURLConnection.setDefaultHostnameVerifier(allowAllHosts);
这就像骑手持的是真工作证,但接的却是别家订单——攻击者可以用合法证书的其它域名冒充你的服务器。
3. 坑三:过期/自签名证书不处理
用户遇到证书过期时,粗暴的解决方式是:
```xml
?? 风险点:当需要更换证书时,必须强制用户更新App。
三、专业级的解决方案(附代码)
?? 方案1:严格模式(推荐金融类App使用)
```kotlin
// 步骤1:创建包含可信CA的KeyStore
val keyStore = KeyStore.getInstance("PKCS12").apply {
load(resources.openRawResource(R.drawable.trusted_cas), null)
}
// 步骤2:校验证书链+域名+有效期
val sslContext = SSLContext.getInstance("TLS").apply {
init(null, arrayOf(object : X509TrustManager {
override fun checkClientTrusted(chain: Array
throw CertificateException("客户端证书不被接受")
override fun checkServerTrusted(chain: Array
// CA校验
val validUntil = chain[0].notAfter
if (validUntil.before(Date())) throw CertificateExpiredException()
// OCSP或CRL检查(此处省略)
}
override fun getAcceptedIssuers() = arrayOf
}), SecureRandom())
?? 方案2:兼容自签名但安全的方式(企业内网场景)
// Pin住公钥哈希而非整个证书(允许轮换证书)
val certPin = "sha256/AAAAAAAAAAAAAAAA=" // 从合法证书提取
val certificatePinner = CertificatePinner.Builder()
.add("api.yourcompany.com", certPin)
.build()
val okHttpClient = OkHttpClient.Builder()
.certificatePinner(certificatePinner)
四、高级防御技巧
1. Certificate Transparency监控
通过Google的CT日志服务检测异常颁发的证书:
```java
CTVerifier ctVerifier = new CTVerifier(new FileLogStore(ctLogDir));
ctVerifier.verify(chain); // 会抛出异常如果不在日志中
```
2. 动态更新信任锚
AWS等云服务商提供CA更新接口:
https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem
3. Root CA白名单过滤
屏蔽Let's Encrypt等高风险CA(根据业务需求):
```xml
五、测试阶段该怎么做?
1. Charles/Fiddler调试正确姿势
2. 自动化检测工具
- MobSF扫描`android:usesCleartextTraffic`
- Burp Suite检查Missing Certificate Pinning
来说,Android HTTPS安全不是简单的"能用就行",而是需要像防盗门一样层层设防。记住一个原则:凡是没有严格校验的地方,都是黑客的突破口。
TAG:android https 证书验证,android 证书 信任 设置,安卓证书验证失败,安卓app证书验证失败怎么回事,android app证书,安卓app证书失效了怎么办