Android network-security-config.xml SSL固定未按预期生效问题排查
问题:证书钉扎配置未生效,错误PIN仍能成功连接
已创建network_security_config.xml文件,配置内容如下:
<network-security-config> <domain-config> <domain includeSubdomains="true">api-qa.xxx.net</domain> <pin-set > <pin digest="SHA-256">xWyFxD64FLSsMf0qBC+xxxxxxxxxYuQl4fWLPzZXBOQ</pin> <pin digest="SHA-256">xWyFxD64FLSsMf0qBC+xxxxxxxxxYuQl4fWLPzZXBOQ</pin> </pin-set> </domain-config> </network-security-config>
并已在AndroidManifest.xml中通过android:networkSecurityConfig="@xml/network_security_config"引用该配置。当前项目minSdkVersion为24,使用Volley库进行网络通信。但使用错误的随机PIN值时,仍未出现证书错误,连接成功。请问是否存在配置错误?
排查分析与解决建议
1. 重复PIN值导致校验失效
你的pin-set中两个PIN完全相同,这不符合证书钉扎的基本要求。Android要求钉扎配置需包含至少一个对应目标域名证书链中有效证书的公钥哈希,同时建议添加备用PIN(用于证书轮换)。两个完全一致的错误PIN会让系统无法正确触发钉扎校验逻辑,甚至直接忽略该pin-set配置。
2. 确认PIN值是否为正确的公钥哈希
证书钉扎的是证书公钥的SHA-256哈希,而非证书本身的指纹。你可以通过以下命令获取正确的公钥哈希:
openssl s_client -connect api-qa.xxx.net:443 | openssl x509 -pubkey -noout | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64
对比生成的结果与你配置的PIN值是否一致。
3. 检查Volley是否绕过系统安全配置
Volley默认使用系统HttpURLConnection,会遵循网络安全配置,但如果你的Volley初始化代码自定义了SSLSocketFactory或X509TrustManager,会直接绕过系统的证书钉扎校验。检查Volley请求队列的初始化代码,确认是否存在替换默认SocketFactory的逻辑。
4. 验证域名匹配与请求目标
确认实际请求的域名是否完全在api-qa.xxx.net及其子域名范围内,避免因域名拼写错误导致配置未命中。
5. 排除调试环境的例外情况
- 如果当前是debug版本(
android:debuggable="true"),Android会自动信任用户安装的CA证书(如抓包工具的证书),此时证书钉扎会被绕过。 - 检查设备是否安装了第三方CA证书,若有,需移除后再测试。
内容的提问来源于stack exchange,提问作者eager
相关产品推荐
相关产品推荐

