SSL cert chain validation (platform fallback) not working with (domain) network security config(xml)

在Android中,配置了network_security_config.xml后,SSL校验遇到JNI异常。问题源于OpenSSL验证失败,期望系统兜底时,特定域配置导致异常。分析指出应调用支持hostName的重载方法解决。目前的临时解决办法是避免平台验证,如通过SSL_CERT_FILE环境变量设置CA pem。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景介绍

在Android平台,当我们使用HTTPs(SSL)进行网络请求的时候,需要配置network_security_config.xml,如果我们在一个或者多个domain-config节点中配置网络安全属性,例如cert pinning,系统的SSL校验程序(verity_cert_chain_platform_specific)就会爆出JNI异常(CertificateException)。下面是一个network_security_config示例

<network-security-config>
    <domain-config cleartextTrafficPermitted="false">
        <domain includeSubdomains="true">azurewebsites.net</domain>
        <pin-set expiration="2021-09-24">
            <pin digest="SHA-256">...</pin>
            <pin digest="SHA-256">...</pin>
        </pin-set>
    </domain-config>

</network-security-config>

有一点需要注意,上述异常的发生场景如下:默认的OpenSSL校验方法失败了,而我们希望系统校验程序(verify_cert_chain_platform_specific

### 解决方案概述 当遇到 `PKIX path validation failed` 错误时,通常意味着 SSL/TLS 握手过程中无法验证服务器证书的有效性。具体来说,客户端未能找到一条从服务器提供的证书到本地信任库中的可信根证书的信任链[^1]。 ### 原因分析 此问题可能由多种因素引起: - **缺少中间证书**:如果服务器配置中遗漏了必要的中间CA证书,则客户端将无法构建完整的认证路径。 - **受信存储更新不足**:本地JVM使用的cacerts文件未包含最新的或必需的根证书。 - **时间同步问题**:系统时间和NTP设置不正确可能导致有效性检查失败,特别是对于带有严格有效期限的证书[^3]。 ### 实施解决方案 #### 方法一:确认并安装缺失的中间证书 确保Web应用服务器已正确定义整个证书链条,包括所有上级颁发机构签发给该站点的中间证书。这可以通过联系证书提供商获取完整链来完成。 #### 方法二:更新Java KeyStore (JKS) 定期下载最新版本的浏览器兼容型CA列表,并将其导入至运行应用程序所依赖的那个特定版本的JRE/JDK自带keystore内: ```bash keytool -importcert -alias exampleca -file /path/to/intermediate.crt -keystore $JAVA_HOME/lib/security/cacerts ``` 默认密码通常是`changeit`. #### 方法三:校准操作系统与时钟服务 保证主机的时间戳处于合理范围内,因为过期或未来的日期都会触发类似的错误消息。可以考虑部署专业的网络授时协议(NTP)客户程序以保持精准度。 #### 方法四:调试模式启用 为了更深入地了解具体的验证过程,在启动参数里加入如下选项可以帮助收集诊断信息: ```properties -Djavax.net.debug=ssl,trustmanager ``` 这样可以在日志输出中看到详细的握手流程以及每一步骤的状态报告。 ### 验证修复效果 重启受影响的服务之后尝试重现原始场景;正常情况下应该不会再碰到相同的异常状况。另外也可以通过命令行工具如`openssl s_client`来进行独立测试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值