如何让查尔斯代理与 Android 7 牛轧糖一起使用?
How to get charles proxy work with Android 7 nougat?
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 库。
知道我做错了什么吗?
根据 OP 评论的故障排除线程,答案是只安装受信任的代理 CA 证书,而不是它的证书 + 私钥。
问题是由两个因素引起的:
不仅要安装 MiTM 代理的 CA 证书,还要安装它的私钥(从而使设备上的 VPN 应用能够 decrypt/MiTM 来自其他应用的网络流量)。您不需要设备上的 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
流猜测它是在处理 client/user 身份验证凭据还是服务器身份验证信任锚,假设如果指定了私钥,则它必须是 client/user 身份验证凭据.在您的情况下,它错误地假设您正在安装 client/user 身份验证凭据而不是服务器身份验证信任锚。
P. S. 关于您的网络安全配置,您可能应该将应用配置为在调试模式下也信任 "system" 信任锚(调试覆盖部分)。否则,应用程序的调试版本将无法工作,除非连接由代理进行中间人攻击,其 CA 证书在 Android 设备上安装为受信任。
解决方案是 不使用 .p12,只需使用 Chrome(在 wifi 上配置代理)导航到 http://charlesproxy.com/getssl 和 安装下载的 .pem 文件.
我在 Nexus 5X 运行 Android 7.0 上遇到了完全相同的问题。
之前有从 Charles 3.11.5 导出的 .p12(帮助->SSL 代理->导出 Charles 根证书和私钥)。当我尝试从 phone(设置->安全->从存储安装)安装 .p12 时,它只出现在 "User credentials" 下,从不出现在 "Trusted credentials" 下,当然 SSL 与 Charles 代理确实如此不工作。
Android 7.0 的总 "how-to" 是这样的:
- 配置 WiFi + 代理(Charles 的要求)。连接它。
- 在设备上,使用 Chrome 导航到 http://charlesproxy.com/getssl,接受下载 .pem 的请求,然后按 "open",它会启动 "Certificate installer" 应用程序。使用它将证书安装为 "VPN and apps"。
- 将属性
android:networkSecurityConfig="@xml/network_security_config"
设为 <application>
at Manifest.xml
- 用第一个 post 的内容创建 res/xml/network_security_config.xml(完全正确)。
- 启动 Charles 和应用程序,玩得开心。
P.S。检查设备上的 date/time。应该是正确的。
我使用的是 Android 7.1.1,这是我在我的设备 (OnePlus One) 上的设置方式 - 没有更改清单(我的应用程序目标是 API 21):
在 Charles 代理中:
Help > SSL Proxying > Install Charles Root Certificate on a Mobile Device or Remote Browser
。此步骤为您提供 代理 IP 和端口 号码以及 link 您应该下载 charles proxy SSL 的位置。
你的 phone:
Wifi Settings > Modify Network > Advanced Options
。将 Proxy 设置为 Manual
并将您从 Charles 收到的 IP 和端口号分别输入 Proxy hostname
和 Proxy port
。
(可选)您可能无法访问 Charles 之前提供的 chls.pro/ssl link。在我的设备上,我总是被告知我没有网络连接。我将 charlesproxy.com 添加到 Bypass proxy for
字段。
在您的浏览器上,转到第 3 步中的 link 并下载任何必要的证书(如果它在 Chrome 上不起作用,请下载 Dolphin 浏览器)。您可以用任何名称命名您的证书。
返回 Charles 代理:
- 如果您的设置默认提示您进行远程连接,您应该会收到
Allow
或 Deny
您的 phone 使用代理的提示。
您现在可以在 Nougat 7.1.1 上使用 Charles。
对我来说,SSL 代理无法在 release
构建变体中工作。在 debug
工作。
我也遇到了同样的错误并尝试了各种方法,直到我读到以下关键消息:“证书显示在用户凭据中,但不显示在受信任的凭据中”。
所以问题是如何让证书出现在那里,这些是我遵循的步骤:
- 从http://chls.pro/ssl
下载模拟器中的证书
- 安装证书和信任
- 设置应用程序 -> 安全 -> 加密和凭据 -> 安装证书 -> Select CA 证书选项
- Select 仍然安装
- Select 您在存储中下载的 Charles 代理证书
- 验证您是否信任该证书
- 打开 Trusted Credentials -> User Tab 你可以在这里看到你的证书
- 开始拦截 HTTPS 流量
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 库。
知道我做错了什么吗?
根据 OP 评论的故障排除线程,答案是只安装受信任的代理 CA 证书,而不是它的证书 + 私钥。
问题是由两个因素引起的:
不仅要安装 MiTM 代理的 CA 证书,还要安装它的私钥(从而使设备上的 VPN 应用能够 decrypt/MiTM 来自其他应用的网络流量)。您不需要设备上的 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
流猜测它是在处理 client/user 身份验证凭据还是服务器身份验证信任锚,假设如果指定了私钥,则它必须是 client/user 身份验证凭据.在您的情况下,它错误地假设您正在安装 client/user 身份验证凭据而不是服务器身份验证信任锚。
P. S. 关于您的网络安全配置,您可能应该将应用配置为在调试模式下也信任 "system" 信任锚(调试覆盖部分)。否则,应用程序的调试版本将无法工作,除非连接由代理进行中间人攻击,其 CA 证书在 Android 设备上安装为受信任。
解决方案是 不使用 .p12,只需使用 Chrome(在 wifi 上配置代理)导航到 http://charlesproxy.com/getssl 和 安装下载的 .pem 文件.
我在 Nexus 5X 运行 Android 7.0 上遇到了完全相同的问题。 之前有从 Charles 3.11.5 导出的 .p12(帮助->SSL 代理->导出 Charles 根证书和私钥)。当我尝试从 phone(设置->安全->从存储安装)安装 .p12 时,它只出现在 "User credentials" 下,从不出现在 "Trusted credentials" 下,当然 SSL 与 Charles 代理确实如此不工作。
Android 7.0 的总 "how-to" 是这样的:
- 配置 WiFi + 代理(Charles 的要求)。连接它。
- 在设备上,使用 Chrome 导航到 http://charlesproxy.com/getssl,接受下载 .pem 的请求,然后按 "open",它会启动 "Certificate installer" 应用程序。使用它将证书安装为 "VPN and apps"。
- 将属性
android:networkSecurityConfig="@xml/network_security_config"
设为<application>
at Manifest.xml - 用第一个 post 的内容创建 res/xml/network_security_config.xml(完全正确)。
- 启动 Charles 和应用程序,玩得开心。
P.S。检查设备上的 date/time。应该是正确的。
我使用的是 Android 7.1.1,这是我在我的设备 (OnePlus One) 上的设置方式 - 没有更改清单(我的应用程序目标是 API 21):
在 Charles 代理中:
Help > SSL Proxying > Install Charles Root Certificate on a Mobile Device or Remote Browser
。此步骤为您提供 代理 IP 和端口 号码以及 link 您应该下载 charles proxy SSL 的位置。
你的 phone:
Wifi Settings > Modify Network > Advanced Options
。将 Proxy 设置为Manual
并将您从 Charles 收到的 IP 和端口号分别输入Proxy hostname
和Proxy port
。(可选)您可能无法访问 Charles 之前提供的 chls.pro/ssl link。在我的设备上,我总是被告知我没有网络连接。我将 charlesproxy.com 添加到
Bypass proxy for
字段。在您的浏览器上,转到第 3 步中的 link 并下载任何必要的证书(如果它在 Chrome 上不起作用,请下载 Dolphin 浏览器)。您可以用任何名称命名您的证书。
返回 Charles 代理:
- 如果您的设置默认提示您进行远程连接,您应该会收到
Allow
或Deny
您的 phone 使用代理的提示。
您现在可以在 Nougat 7.1.1 上使用 Charles。
对我来说,SSL 代理无法在 release
构建变体中工作。在 debug
工作。
我也遇到了同样的错误并尝试了各种方法,直到我读到以下关键消息:“证书显示在用户凭据中,但不显示在受信任的凭据中”。
所以问题是如何让证书出现在那里,这些是我遵循的步骤:
- 从http://chls.pro/ssl 下载模拟器中的证书
- 安装证书和信任
- 设置应用程序 -> 安全 -> 加密和凭据 -> 安装证书 -> Select CA 证书选项
- Select 仍然安装
- Select 您在存储中下载的 Charles 代理证书
- 验证您是否信任该证书
- 打开 Trusted Credentials -> User Tab 你可以在这里看到你的证书
- 开始拦截 HTTPS 流量