Android 7.0 之后抓包 Charles 手机配置证书后仍报: SSLHandshake: Received fatal alert: certificate_unknown

本文介绍了解决安卓7及以上版本系统中因安全策略调整导致的抓包失败问题。通过配置network_security_config.xml文件信任用户添加的CA证书,并在AndroidManifest.xml中指定配置路径。

Client SSL handshake failed: An unknown issue occurred processing the certificate (certificate_unknown) 

æå失败

安卓7之后调整了安全策略会导致部分手机抓包失败,请参考官网方法:

https://developer.android.google.cn/training/articles/security-config

其中 用于调试较安全的配置CA[证书颁发机构]方式为:

1 res/xml/network_security_config.xml

<!-- Trust user added CAs while debuggable only -->
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <debug-overrides>
        <trust-anchors>
            <certificates src="user"/>
        </trust-anchors>
    </debug-overrides>
</network-security-config>

2  清单文件里添加

<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
    <application android:networkSecurityConfig="@xml/network_security_config"
                    ... >
        ...
    </application>
</manifest>

 

错误 `javax.net.ssl.SSLHandshakeException: Received fatal alert: certificate_unknown` 表示在 Java 应用中尝试建立 SSL/TLS 连接时,服务器提供的证书不被信任,通常是由于证书未被 Java 的信任库(`cacerts`)所信任。 --- ### 常见原因及解决方法: #### 1. **服务器使用的是自签名证书** - **解决方法**:将该证书导入到 Java 的信任库(`cacerts`)中。 ```bash keytool -import -alias myserver -file server.crt -keystore $JAVA_HOME/jre/lib/security/cacerts ``` - 默认密码是 `changeit`。 #### 2. **中间证书未安装完整** - 服务器可能没有正确配置完整的证书链,导致客户端无法验证证书。 - **解决方法**:联系服务器管理员,确保 SSL 证书链完整(包括中间证书)。 #### 3. **Java 版本过旧,不支持新证书算法** - 某些旧版本的 Java 不支持新的加密算法或证书格式(如 ECDSA、SHA-256)。 - **解决方法**:升级 Java 到最新版本。 #### 4. **临时绕过证书验证(仅限测试)** > ⚠️ **不推荐用于生产环境!** ```java // 忽略所有证书验证(仅用于测试) SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, new TrustManager[]{new X509TrustManager() { public void checkClientTrusted(X509Certificate[] chain, String authType) {} public void checkServerTrusted(X509Certificate[] chain, String authType) {} public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; } }}, new SecureRandom()); HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory()); HttpsURLConnection.setDefaultHostnameVerifier((hostname, session) -> true); ``` #### 5. **使用自定义信任库** - 可以指定一个自定义的信任库,而不是使用系统默认的 `cacerts`。 ```java System.setProperty("javax.net.ssl.trustStore", "path/to/truststore.jks"); System.setProperty("javax.net.ssl.trustStorePassword", "storepass"); ``` --- ### 总结步骤: 1. 确认是否是自签名证书。 2. 使用 `keytool` 导入证书。 3. 检查服务器 SSL 配置是否完整。 4. 升级 Java 环境。 5. 测试连接。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值