Android应用配置自签名证书后仍无法访问HTTPS链接问题求助
排查步骤
1. 核验网络安全配置文件正确性
- 确认
networking_security_config.xml内容符合规范,可参考以下模板修改:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config> <!-- 替换为实际服务端域名/IP,不要携带端口、路径后缀 --> <domain includeSubdomains="true">your.domain.com</domain> <trust-anchors> <!-- raw目录下的证书文件名不要带后缀,比如存放sslcert.pem,此处填@raw/sslcert --> <certificates src="@raw/sslcert" /> </trust-anchors> </domain-config> </network-security-config>
- 确认raw目录下的证书文件名仅包含小写字母、数字、下划线,Android资源文件不支持大写字母、特殊字符,比如
SslCert.pem会识别失败,必须改为全小写格式。 - 确认PEM格式证书有效,可执行OpenSSL命令校验:
openssl x509 -in sslcert.pem -text -noout,能正常输出证书信息才是合法文件。正确的CER转PEM指令为:openssl x509 -inform DER -in sslcert.cer -out sslcert.pem
如果原CER文件本身就是PEM编码,无需转换直接改后缀放入raw目录即可,转换格式错误会导致证书无效。
2. 核验清单文件配置
- 确认
AndroidManifest.xml的application节点下配置为android:networkSecurityConfig="@xml/networking_security_config",文件名需和实际xml目录下的配置文件名完全一致,不要出现拼写错误。 - 确认App的
targetSdkVersion≥24,网络安全配置仅对Android 7.0(API 24)及以上系统生效,更低版本系统需要单独给HTTP客户端配置自定义SSLSocketFactory。
3. 核验业务代码配置
- 如果你使用OkHttp、Retrofit等第三方网络框架,不要自行配置自定义SSLSocketFactory、X509TrustManager,框架默认会调用系统信任管理器,自行添加的证书校验逻辑会覆盖系统网络安全配置导致失效。
- 确认服务端TLS版本≥1.2,Android 10及以上系统默认禁用TLS 1.0/1.1,低版本TLS协议会直接被拦截。
- 确认服务端证书的SAN(主题备用名称)包含你访问的域名/IP,如果证书仅绑定了域名,使用IP访问会触发主机名不匹配错误,需要将IP添加到证书的SAN字段,或者自定义主机名校验器。
4. 临时调试方案
如果仍无法定位问题,可以在network-security-config中添加debug覆写配置,测试debug包时临时信任用户证书,若能正常访问则说明之前的证书路径、内容存在配置错误:
<debug-overrides> <trust-anchors> <certificates src="user" /> </trust-anchors> </debug-overrides>
内容的提问来源于stack exchange,提问作者Mouhcine Oussama
相关产品推荐
相关产品推荐

