如何让Charles Charles Proxy与Android 7 Nougat一起工作?


101

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.

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

我正在使用okhttp3作为HTTP库。

知道我在做什么错吗?


1
作为一项快速测试,请尝试将user一个添加/移动到中<base-config>,看看是否有变化。它不应该,但是只需要一点时间就可以尝试。
CommonsWare,2016年

您是否不需要在developer.android.com/training/articles/security-config.html中添加针对Charles的显式CA :“信任其他CA”,因为Charles CA是一个自生成的CA,不会出现在Android系统信任链?
莫里森·张

@Morisson Chang:我不想将Charles CA嵌入到应用程序中,我希望能够像以前一样在开发电话上手动添加它。来自Settings -> Security -> Install from storage
mbonnin

1.您如何在应用程序的AndroidManifest.xml中引用network_security_config.xml?2.您可以链接.pfx文件吗?我认为它仅包含CA证书(没有私钥),因此应该可以发布。我问是因为,如果.pfx包含私钥,那么它将被假定为客户端证书文件,因此该文件中的CA将不会被安装为可用于服务器身份验证的受信任文件。
Alex Klyubin '16

1
@AlexKlyubin hurra,它现在正在工作:)。我想我需要重新启动Charles或App或其他任何东西。我很困惑,因为在牛轧糖之前,我已经在无数的Android设备上安装了相同的.pfx文件,并且它们被识别为可以。但是现在一切都很好。您能写一个答案让我批准吗?
mbonnin

Answers:


26

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

该问题是由两个因素引起的:

  1. 不仅安装MiTM代理的CA证书,还安装其私钥(从而使设备上的VPN应用能够从其他应用解密/ MiTM网络流量)。您不需要设备上的MiTM代理的私钥。

  2. Android Nougat更改Settings -> Security -> Install from storage文件行为的行为,该文件除证书外还包含私钥。行为上的变化掩盖了上述问题。

在牛轧糖之前Settings -> Security -> Install from storage,除了证书之外,包含私钥的文件流还错误地将证书安装为受信任的服务器身份验证(例如,HTTPS,TLS,从而使您的MiTM成功),此外还被正确地安装为用于以下目的的客户端证书:向服务器验证此Android设备。在Nougat中,该错误已修复,并且不再将这些证书安装为受信任的服务器身份验证。这样可以防止客户端身份验证凭据影响(削弱)服务器连接的安全性。在您的情况下,这将阻止您的MiTM成功。

使问题变得复杂的是,Settings -> Security -> Install from storage它没有为用户提供明确的方式来指定用户安装客户端身份验证凭据(私钥+证书链)还是服务器身份验证信任锚(仅CA证书-不需要私钥) 。结果,该Settings -> Security -> Install from storage流程通过假设(如果指定了私钥)它必须是客户端/用户身份验证凭据来猜测它是在处理客户端/用户身份验证凭据还是在服务器身份验证信任锚。在您的情况下,它错误地假定您正在安装客户端/用户身份验证凭据,而不是服务器身份验证信任锚。

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


1
关于PS:文档说Trust anchors specified in debug-overrides are added to all other configurations。因此,我的印象是它已添加到“ base-config”中,而不是完全替换它?
mbonnin

哦,对了。您无需在调试覆盖中明确列出“系统”信任锚。
Alex Klyubin

4
这个答案还不清楚。请参阅下面的@stkent答案。
亚当·赫维兹

4
同意这个答案可以解释正在发生的事情,但是还不清楚应该采取什么步骤。
StarWind0

114

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

在运行Android 7.0的Nexus 5X上,我遇到了完全相同的问题。以前从Charles 3.11.5导出了.p12(帮助-> SSL代理->导出Charles Root证书和私钥)。当我尝试从电话安装.p12(“设置”->“安全性”->“从存储安装”)时,它仅出现在“用户凭据”下,而从未出现在“受信任的凭据”下,当然,带有Charles代理的SSL无效。

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

  1. 配置WiFi +代理(Charles要求如何)。连接它。
  2. 在设备上,使用Chrome浏览到http://charlesproxy.com/getssl,接受下载.pem的请求,然后按“打开”,将启动“证书安装程序”应用程序。使用它来将证书安装为“ VPN和应用程序”。
  3. 把属性android:networkSecurityConfig="@xml/network_security_config"<application>在的Manifest.xml
  4. 使用第一篇文章中的内容创建res / xml / network_security_config.xml(完全正确)。
  5. 启动Charles和应用程序,玩得开心。

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


2
关于这个好答案的重要说明:如果您的应用程序的目标是API 23或更低版本,则不需要步骤3和4。实际上,如果您具有API 23,则将无法编译network-security-config内容或更低。
大卫·费朗

1
这是Android 7.0的绝佳解决方案。比官方的Charles Proxy信息清晰得多。
亚当·林克

3
在7.1.1中,可能只有我自己,但这些步骤对我不再有用。我最近做了一次更新
satyajit

@satyajit此解决方案适用于Google Pixel上的Android 7.1.1。
迪克·卢卡斯

有或没有第3步和第4步?
satyajit

-1

我使用的是Android 7.1.1,这是我在设备(OnePlus One)上进行设置的方式-无需更改清单(我的目标是应用的API 21):

在Charles Proxy中:

  1. Help > SSL Proxying > Install Charles Root Certificate on a Mobile Device or Remote Browser。此步骤为您提供了代理IP和端口号,以及指向您应下载charles代理SSL的链接。

在手机上:

  1. Wifi Settings > Modify Network > Advanced Options。将“代理”设置为ManualProxy hostname然后Proxy port分别将您从Charles收到的IP和端口号输入到和中。

  2. (可选)您可能无法访问Charles所提供的chls.pro/ssl链接。在我的设备上,始终会通知我没有网络连接。我将charlesproxy.com添加到了该Bypass proxy for字段。

  3. 在您的浏览器上,转到第3步中的链接,然后下载所需的任何证书(如果该证书在Chrome上不起作用,请下载Dolphin Browser)。您可以使用任意名称命名证书。

回到Charles Proxy:

  1. 如果默认设置是提示您进行远程连接,则应该向您发送提示,Allow或者Deny让您的电话使用代理。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.