文档中心
Android寮€鍙戝繀鐭ュ浣曟纭疄鐜癏TTPS鎸囧畾璇佷功楠岃瘉锛堥檮浠g爜绀轰緥锛?txt
时间 : 2025-09-27 15:40:50浏览量 : 1

在移动应用开发中,HTTPS通信是保障用户数据安全的基础。但仅仅使用HTTPS还不够——如果忽略证书验证,攻击者仍可能通过中间人攻击(MITM)窃取数据。本文将用通俗易懂的方式,结合代码示例,讲解Android中如何实现指定证书验证(Pinning),让你的应用更安全。
一、为什么需要指定证书验证?
HTTPS默认会验证服务器证书是否由受信任的机构(如DigiCert、Let's Encrypt)签发,但攻击者可能:
1. 伪造证书:通过恶意代理工具(如Charles、Fiddler)安装自签名证书。
2. 利用系统漏洞:如果设备被Root或越狱,攻击者可篡改系统信任的证书库。
例子:某金融App未做证书固定,黑客在公共WiFi下用Fiddler抓包,轻松获取用户的银行卡号和密码。
二、Android实现指定证书验证的3种方式
1. 公钥固定(Public Key Pinning)
只信任特定公钥,即使证书到期后重新签发(公钥不变)仍能通过验证。
```java
// 示例:OkHttp实现公钥固定
String hostname = "api.yourdomain.com";
CertificatePinner certificatePinner = new CertificatePinner.Builder()
.add(hostname, "sha256/AAAAAAAAAAAAAAAAAAAAAAAA=") // 替换为你的公钥哈希
.build();
OkHttpClient client = new OkHttpClient.Builder()
.certificatePinner(certificatePinner)
```
2. 全证书固定(Full Certificate Pinning)
直接绑定预置的完整证书文件(`.cer`或`.pem`),但需注意证书过期问题。
// 示例:使用预置的BKS格式证书库
InputStream certStream = context.getResources().openRawResource(R.raw.your_cert);
KeyStore keyStore = KeyStore.getInstance("BKS");
keyStore.load(certStream, "password".toCharArray());
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(keyStore);
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, tmf.getTrustManagers(), null);
.sslSocketFactory(sslContext.getSocketFactory(), (X509TrustManager) tmf.getTrustManagers()[0])
3. 网络安全配置(Network Security Config)
Android 7.0+推荐的方式,通过XML文件声明信任的证书。
```xml
三、实际开发中的注意事项
1. 备用密钥:至少固定2个公钥,防止原密钥失效导致App无法连接。
2. 调试模式豁免:开发时可通过`android:debuggable="true"`临时关闭验证。
3. 错误处理:捕获`CertificateException`并提示用户可能存在风险。
四、测试你的实现
使用工具验证是否生效:
- Charles/Fiddler:尝试抓包应失败并报错`SSLHandshakeException`。
- Burp Suite:导入你的证书测试中间人攻击是否被阻断。
五、
HTTPS若不做证书固定,就像给门上锁却把钥匙放在门口垫子下!通过公钥固定、全证书绑定或Network Security Config,能有效防御中间人攻击。根据项目需求选择方案,并记得处理好兼容性和错误场景。
> 延伸阅读:[OWASP Mobile Security Testing Guide](https://owasp.org/www-project-mobile-security-testing-guide/)
TAG:android https 指定证书验证码,安卓手机app证书验证失败,安卓https证书,安卓开发验证码登录,android获取手机验证码