文档中心
Android缁曡繃HTTPS璇佷功鏍¢獙鐨?绉嶅父瑙佹柟寮忓強闃叉姢鎸囧崡锛堥檮瀹炰緥璁茶В锛?txt
时间 : 2025-09-27 15:40:54浏览量 : 2

HTTPS作为互联网通信的安全基石,依赖数字证书验证服务器身份。但在Android开发中,开发者或攻击者可能因测试需求或恶意目的绕过证书校验,导致中间人攻击(MITM)风险。本文用通俗语言解析5种典型绕过方式,并给出防护建议。
一、为什么HTTPS证书校验会被绕过?
HTTPS协议通过“握手”验证服务器证书的合法性(如域名匹配、CA机构可信等)。但以下场景可能导致校验失效:
- 测试环境:开发者使用自签名证书,为省事直接关闭校验。
- 恶意应用:恶意软件主动绕过校验以窃取数据(如银行账号)。
- 老旧代码:早期Android版本默认信任所有证书(如4.0以下)。
二、5种常见的Android HTTPS证书绕过方式(附实例)
1. 自定义TrustManager信任所有证书
开发者重写`X509TrustManager`接口,强制信任任何证书:
```java
TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) {}
public void checkServerTrusted(X509Certificate[] chain, String authType) {} // 空实现=不校验
public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; }
}
};
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
```
风险:攻击者可伪造任意证书拦截通信。
2. 忽略主机名验证(HostnameVerifier)
即使证书有效,若域名不匹配仍应拒绝连接。但以下代码会放行所有域名:
HttpsURLConnection.setDefaultHostnameVerifier((hostname, session) -> true);
实例:某金融App未校验`api.bank.com`与证书域名是否一致,攻击者可用相似域名(如`api.bank.fake.com`)钓鱼。
3. 使用低安全协议(如SSLv3)
老旧协议(如SSLv3)存在漏洞(如POODLE攻击),强制使用会导致降级风险:
SSLContext.getInstance("SSLv3"); // 已弃用的协议
4. 安装用户自定义CA证书
用户手动安装恶意CA证书后,设备会信任该CA签发的所有假证书。常见手法:
- 诱导用户下载“安全更新”实则安装CA证书。
- 利用系统漏洞静默安装(需Root权限)。
5. 网络代理工具中间人攻击
工具如Fiddler/Burp Suite生成自签名证书并注入设备,配合代理抓包:
```bash
Burp Suite导出CA证书后推送到设备
adb push burp-cert.cer /sdcard/
三、如何防护?开发者必做的4项安全措施
1. 严格实现证书固定(Certificate Pinning)
将服务端公钥或哈希值硬编码到App中,仅信任指定证书:
```kotlin
val certificateFactory = CertificateFactory.getInstance("X.509")
val inputStream = resources.openRawResource(R.raw.my_cert) // 预置合法证书
val trustedCert = certificateFactory.generateCertificate(inputStream)
val keyStore = KeyStore.getInstance(KeyStore.getDefaultType()).apply {
load(null, null)
setCertificateEntry("ca", trustedCert)
}
val sslContext = SSLContext.getInstance("TLS").apply {
init(null, TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()).apply {
init(keyStore)
}.trustManagers, null)
2. 启用网络安全配置(Android 7.0+)
在`res/xml/network_security_config.xml`中限制可信域和CA:
```xml
3. 禁用明文传输 & 强制HSTS
在Manifest中声明:
4. 动态检测代理与VPN
运行时检查是否开启代理/VPN,提示风险:
fun isProxyActive(context: Context): Boolean {
val proxyHost = System.getProperty("http.proxyHost")
return !proxyHost.isNullOrEmpty()
四、一句话原则
“不要信任任何你不控制的设备环境。”无论是开发还是逆向分析,理解HTTPS绕过的原理能帮助更安全地设计或保护应用。
TAG:android 过https 证书,android系统证书,android证书安装器,手机https证书安装,安卓https证书