如何让查尔斯代理与 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 -> Security -> Install from storage
安装了pfx
证书。证书显示在 User Credentials
中,但不在 Trusted credentials -> User
中。在我的棒棒糖设备上,证书列在那里。
我使用 okhttp3 作为 HTTP 库。
知道我做错了什么吗?
【问题讨论】:
作为一项快速测试,尝试将user
添加/移动到<base-config>
中,看看是否会发生变化。不应该,但只需片刻即可尝试。
您不需要在developer.android.com/training/articles/security-config.html 中为 Charles 添加显式 CA:“信任其他 CA”,因为 Charles CA 是自生成的,不会在 Android 系统信任链中?
@Morisson Chang:我不想将 Charles CA 嵌入到应用程序中,我希望能够像以前那样在我的开发手机上手动添加它。来自Settings -> Security -> 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"
属性放到<application>
使用第一篇文章中的内容创建 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 -> Security -> Install from storage
流的行为,文件中包含除证书之外的私钥。这种行为变化暴露了上述问题。
在 Nougat 之前,除了证书之外包含私钥的文件的 Settings -> Security -> Install from storage
流程错误地将证书安装为服务器身份验证受信任(例如,HTTPS、TLS,从而使您的 MiTM 成功),除了正确安装为用于向服务器验证此 Android 设备的客户端证书。在 Nougat 中,该错误已得到修复,并且这些证书不再作为受信任的服务器身份验证安装。这可以防止客户端身份验证凭据影响(削弱)与服务器连接的安全性。在您的场景中,这会阻止您的 MiTM 成功。
使事情复杂化的是Settings -> Security -> Install from storage
没有为用户提供明确的方式来指定他们是安装客户端身份验证凭据(私钥 + 证书链)还是服务器身份验证信任锚(只是一个 CA 证书 - - 不需要私钥)。因此,Settings -> Security -> 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 > SSL Proxying > Install Charles Root Certificate on a Mobile Device or Remote Browser
。此步骤为您提供代理 IP 和端口编号,以及您应该下载 charles 代理 SSL 的链接。
在您的手机上:
Wifi Settings > Modify Network > Advanced Options
。将代理设置为Manual
,并将您从查尔斯那里收到的IP和端口号分别输入Proxy hostname
和Proxy port
。
(可选)您可能无法访问 Charles 之前提供的 chls.pro/ssl 链接。在我的设备上,我总是被告知我没有网络连接。我将 charlesproxy.com 添加到 Bypass proxy for
字段。
在您的浏览器上,转到第 3 步中的链接并下载任何必要的证书(如果它在 Chrome 上不起作用,请下载 Dolphin Browser)。您可以用任何名称命名您的证书。
回到 Charles Proxy:
-
如果您的设置默认提示您进行远程连接,您应该会收到
Allow
或Deny
手机的提示以使用代理。
您现在可以在 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 消息