如何信任 Android 上的自签名证书?

Posted

技术标签:

【中文标题】如何信任 Android 上的自签名证书?【英文标题】:How to trust self signed certificate on Android? 【发布时间】:2016-09-13 21:33:14 【问题描述】:

我已经为我的服务器生成了自签名证书。 然后通过设置 -> 安全 -> 安装将其添加到 android

当我尝试从应用程序连接到我的服务器时出现错误:

java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.

据我了解,在将证书添加到受信任的列表后,它应该可以正常工作。我错过了什么吗? 思路是通过Android系统添加证书,无需修改应用代码。

顺便说一句,我正在使用OkHttpClient 进行网络连接。也许我应该为https 连接启用一些东西?

【问题讨论】:

可能重复:***.com/questions/25509296/… 不,不是。我不想信任所有证书... 你导入CA证书了吗? 是的,正如我通过设置所说的那样 -> 安全 看看这里,它描述了如何解决这个异常:developer.android.com/training/articles/… 【参考方案1】:

对 Android 来说,重要的是,当您生成自签名证书时,将其标记为证书颁发机构,以便授权它对证书进行认证——即使只是对自己进行签名并证明它就是它自己。

这是在 basicConstraints 扩展中完成的,声明 CA:TRUE 而不是默认的 CA:FALSE。当您导入如此标记的证书时,Android 会将其视为用户安装的根证书,您应该能够在 Credential storageTrusted credentials 下看到它>用户

但是,具有此位的证书是一种强大的力量,在过去,这些证书已被邪恶的工具用来监视所谓的加密用户通信。因此,这些天来,当这种 CA 证书生效时,Google Play Protect 将希望与用户交流。

【讨论】:

您知道Android 9 是否改变了这一点?我知道我过去有这个工作(在设置CA:TRUE 之后)但是使用 Android 9,我无法让它运行了......【参考方案2】:

考虑使用src/debug/xml/network_security_config.xml

它应该类似于:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <debug-overrides>
        <trust-anchors>
            <certificates src="@raw/debug_cas"/>
        </trust-anchors>
    </debug-overrides>
</network-security-config>

其中 debug_cas 是您用来为服务器生成证书的自定义证书颁发机构。请注意,如果您使用通过 IP 访问它的本地服务器,您的服务器证书中必须有一个带有该 IP 的 subjectAltName,否则它会给您一个 javax.net.ssl.SSLPeerUnverifiedException

【讨论】:

【参考方案3】:

这个例子有两个代码路径 https://***.com/a/70543735/1542667

先加入网络安全配置,再加入okhttp客户端。

【讨论】:

以上是关于如何信任 Android 上的自签名证书?的主要内容,如果未能解决你的问题,请参考以下文章

Android Volley 自签名证书

在 Windows 7 上信任 Java 7 的自签名证书

Android Volley Self签名证书

在调用 Web 服务时信任过期的自签名证书

在 .Net Core 控制台应用程序中生成受信任的自签名证书

为 localhost 创建一个受信任的自签名 SSL 证书(用于 Express/Node)