关于ssl:如何让Charles Charles代理与Android 7 Nougat一起使用?

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:

1
2
3
4
5
6
7
8
9
10
11
12
13
<?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库。

知道我在做什么错吗?


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

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

Android 7.0的总体"操作方法"如下所示:

  • 配置WiFi +代理(Charles要求如何)。连接它。
  • 在设备上,使用Chrome浏览到http://charlesproxy.com/getssl,接受下载.pem的请求,然后按"打开",它会启动"证书安装程序"应用。使用它来将证书安装为" VPN和应用程序"。
  • 将Manifest.xml中的属性android:networkSecurityConfig="@xml/network_security_config"放入
  • 使用第一篇文章的内容创建res / xml / network_security_config.xml(这是完全正确的)。
  • 启动Charles和应用程序,玩得开心。
  • 附言检查设备上的日期/时间。应该是正确的。


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

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

  • 不仅安装MiTM代理的CA证书,还安装其私钥(从而使设备上的VPN应用能够从其他应用解密/ 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流通过假设(如果指定了私钥)它必须是客户端/用户身份验证凭据来猜测它是在处理客户端/用户身份验证凭据还是服务器身份验证信任锚。在您的情况下,它错误地假定您正在安装客户端/用户身份验证凭据,而不是服务器身份验证信任锚。

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


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

    在Charles Proxy中:

  • Help > SSL Proxying > Install Charles Root Certificate on a Mobile Device or Remote Browser。此步骤为您提供了代理IP和端口号,以及指向您应该在其中下载charles代理SSL的链接。
  • 在手机上:

  • Wifi Settings > Modify Network > Advanced Options。将"代理"设置为Manual,并将您从Charles收到的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。