如何让查尔斯代理与 Android 7 牛轧糖一起工作?

Posted

技术标签:

【中文标题】如何让查尔斯代理与 Android 7 牛轧糖一起工作?【英文标题】:How to get charles proxy work with Android 7 nougat? 【发布时间】:2017-01-06 00:21:16 【问题描述】:

android 7 对证书的处理方式进行了一些更改 (http://android-developers.blogspot.com/2016/07/changes-to-trusted-certificate.html),不知何故我无法让我的 Charles 代理继续工作。

我的 network_security_config.xml:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config>
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>
    <debug-overrides>
        <trust-anchors>
            <certificates src="user" />
        </trust-anchors>
    </debug-overrides>
</network-security-config>

我正在调试模式下运行。但无论如何,我得到javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.

不用说,我确实从Settings -&gt; Security -&gt; Install from storage 安装了pfx 证书。证书显示在 User Credentials 中,但不在 Trusted credentials -&gt; User 中。在我的棒棒糖设备上,证书列在那里。

我使用 okhttp3 作为 HTTP 库。

知道我做错了什么吗?

【问题讨论】:

作为一项快速测试,尝试将user 添加/移动到&lt;base-config&gt; 中,看看是否会发生变化。不应该,但只需片刻即可尝试。 您不需要在developer.android.com/training/articles/security-config.html 中为 Charles 添加显式 CA:“信任其他 CA”,因为 Charles CA 是自生成的,不会在 Android 系统信任链中? @Morisson Chang:我不想将 Charles CA 嵌入到应用程序中,我希望能够像以前那样在我的开发手机上手动添加它。来自Settings -&gt; Security -&gt; Install from storage 1.您如何在应用的 AndroidManifest.xml 中引用 network_security_config.xml? 2. 请链接 .pfx 文件好吗?我认为它只包含 CA 证书(没有私钥),因此应该可以发布。我问是因为,如果 .pfx 包含私钥,它将被假定为客户端证书文件,因此文件中的 CA 不会被安装为受信任的服务器身份验证。 @AlexKlyubin 欢呼,它现在正在工作:)。我想我需要重新启动我的查尔斯或应用程序或其他任何东西。我很困惑,因为在 nougat 之前我已经在无数的 android 设备上安装了相同的 .pfx 文件,并且它们被识别出来了。但现在一切都很好。你能写一个答案让我批准吗? 【参考方案1】:

解决方案是不要使用 .p12,只需使用 Chrome(在 wifi 上配置代理)导航到 http://charlesproxy.com/getssl 并安装下载的 .pem 文件。 p>

我在运行 Android 7.0 的 Nexus 5X 上遇到了完全相同的问题。 之前从 Charles 3.11.5 导出了 .p12(Help->SSL Proxying->Export Charles Root certificate and Private key)。当我尝试从手机(设置->安全->从存储安装)安装 .p12 时,它只出现在“用户凭据”下,而从未出现在“受信任的凭据”下,当然,带有 Charles 代理的 SSL 不起作用。

Android 7.0 的全部“操作方法”如下所示:

    配置 WiFi + 代理(Charles 的要求)。连接它。 在设备上,使用 Chrome 导航到 http://charlesproxy.com/getssl,接受下载 .pem 的请求,然后按“打开”,它会启动“证书安装程序”应用程序。使用它将证书安装为“*** 和应用程序”。 在Manifest.xml中将android:networkSecurityConfig="@xml/network_security_config"属性放到&lt;application&gt; 使用第一篇文章中的内容创建 res/xml/network_security_config.xml(完全正确)。 启动 Charles 和应用程序,玩得开心。

附注检查设备上的日期/时间。应该是正确的。

【讨论】:

关于这个好答案的重要说明:如果您的应用程序面向 API 23 或更低版本,则不需要步骤 3 和 4。事实上,您将无法编译 network-security -config 东西,如果你有 API 23 或更低版本。 这是适用于 Android 7.0 的绝佳解决方案。比官方的 Charles Proxy 信息要清晰得多。 可能只有我,但这些步骤在 7.1.1 中不再适用于我。我最近做了一个更新 @satyajit 这个解决方案适用于我在 Google Pixel 上的 Android 7.1.1 上。 有或没有步骤 3 和 4?【参考方案2】:

根据 OP 的 cmets 故障排除线程,答案是仅将代理的 CA 证书安装为受信任,而不是其证书 + 私钥。

这个问题是由两个因素造成的:

    不仅安装 MiTM 代理的 CA 证书,还安装其私钥(从而使设备上的 *** 应用程序能够解密/MiTM 网络流量来自其他应用程序)。您不需要设备上的中间人代理的私钥。

    Android Nougat 更改了 Settings -&gt; Security -&gt; Install from storage 流的行为,文件中包含除证书之外的私钥。这种行为变化暴露了上述问题。

在 Nougat 之前,除了证书之外包含私钥的文件的 Settings -&gt; Security -&gt; Install from storage 流程错误地将证书安装为服务器身份验证受信任(例如,HTTPS、TLS,从而使您的 MiTM 成功),除了正确安装为用于向服务器验证此 Android 设备的客户端证书。在 Nougat 中,该错误已得到修复,并且这些证书不再作为受信任的服务器身份验证安装。这可以防止客户端身份验证凭据影响(削弱)与服务器连接的安全性。在您的场景中,这会阻止您的 MiTM 成功。

使事情复杂化的是Settings -&gt; Security -&gt; Install from storage 没有为用户提供明确的方式来指定他们是安装客户端身份验证凭据(私钥 + 证书链)还是服务器身份验证信任锚(只是一个 CA 证书 - - 不需要私钥)。因此,Settings -&gt; Security -&gt; Install from storage 流通过假设如果指定了私钥,它必须是客户端/用户身份验证凭据来猜测它是在处理客户端/用户身份验证凭据还是服务器身份验证信任锚。在您的情况下,它错误地假设您正在安装客户端/用户身份验证凭据而不是服务器身份验证信任锚。

P。 S. 关于您的网络安全配置,您可能应该将应用程序配置为在调试模式下也信任“系统”信任锚(调试覆盖部分)。否则,应用程序的调试版本将无法工作,除非连接由代理 MiTM'd,其 CA 证书安装为受信任的 Android 设备上。

【讨论】:

关于 PS:文档说 Trust anchors specified in debug-overrides are added to all other configurations。所以我的印象是它添加到'base-config'而不是完全替换它? 哦,你是对的。您无需在调试覆盖中明确列出“系统”信任锚。 这个答案不清楚。请参考下面@stkent 的回答。 同意这个答案解释了正在发生的事情,但非常不清楚应该采取什么步骤。【参考方案3】:

我使用的是 Android 7.1.1,这是我在设备 (OnePlus One) 上的设置方式 - 没有更改清单(我的应用程序的目标是 API 21):

在查尔斯代理中:

    Help &gt; SSL Proxying &gt; Install Charles Root Certificate on a Mobile Device or Remote Browser。此步骤为您提供代理 IP 和端口编号,以及您应该下载 charles 代理 SSL 的链接。

在您的手机上:

    Wifi Settings &gt; Modify Network &gt; Advanced Options。将代理设置为Manual,并将您从查尔斯那里收到的IP和端口号分别输入Proxy hostnameProxy port

    (可选)您可能无法访问 Charles 之前提供的 chls.pro/ssl 链接。在我的设备上,我总是被告知我没有网络连接。我将 charlesproxy.com 添加到 Bypass proxy for 字段。

    在您的浏览器上,转到第 3 步中的链接并下载任何必要的证书(如果它在 Chrome 上不起作用,请下载 Dolphin Browser)。您可以用任何名称命名您的证书。

回到 Charles Proxy:

    如果您的设置默认提示您进行远程连接,您应该会收到AllowDeny 手机的提示以使用代理。

您现在可以在 Nougat 7.1.1 上使用 Charles。

【讨论】:

【参考方案4】:

对我来说,SSL 代理在 release 构建变体中不起作用。在debug 工作。

【讨论】:

这很可能是由于nework_security_config.xml (developer.android.com/training/articles/security-config) 我也面临同样的问题。你解决了吗? @kreker

以上是关于如何让查尔斯代理与 Android 7 牛轧糖一起工作?的主要内容,如果未能解决你的问题,请参考以下文章

Android 7.0 Nougat(牛轧糖)---对开发者来说

RR OS 7 最後版本 5.8.5 更新 和Android 8 消息

Android OS 特性总结

如何在charles代理中阻止localhost流量?

Android API level 与version对应关系

Android API level 与version对应关系