如何获得与Android 7牛轧糖查尔斯代理工作?

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> 

我在debugging模式下运行。 但是无论如何,我得到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证书安装为可信,而不是其证书+私钥。

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

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

  2. Android Nougat更改了Settings -> Security -> Install from storagestream程Settings -> Security -> Install from storage除了证书以外还包含私钥的文件。 这种行为的变化揭露了上述问题。

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

更复杂的是, Settings -> Security -> Install from storage并没有提供明确的方式让用户指定他们是安装客户端authentication证书(私钥+证书链)还是服务器authentication信任锚(仅仅是一个CA证书 – 不需要私钥)。 因此, Settings -> Security -> Install from storagestream程Settings -> Security -> Install from storage猜测它是处理客户端/用户身份validation凭据还是服务器身份validation信任锚点,方法是假定指定了私钥,则它必须是客户端/用户身份validation凭据。 在你的情况下,它错误地认为你正在安装一个客户端/用户身份validation凭证而不是服务器身份validation信任锚。

PS关于您的networking安全configuration,您应该configuration应用程序也以debugging模式(debugging覆盖部分)信任“系统”信任锚。 否则,应用程序的debugging版本将无法工作,除非连接由CA证书在Android设备上被安装为受信任的代理MiTM。

解决方法是不要使用.p12 ,只需使用Chrome浏览器(在WiFi上configuration代理)导航到http://charlesproxy.com/getssl并;安装下载的.pem文件

我在运行Android 7.0的Nexus 5X上遇到了同样的问题。 先前从Charles 3.11.5(Help-> SSL Proxying-> Export Charles Root证书和Private key)导出.p12。 当我试图从手机上安装.p12(设置 – >安全 – >从存储安装)时,它只出现在“用户凭据”下,而不是在“可信凭证”下,当然用查尔斯代理的SSL也不起作用。

Android 7.0的总体“如何”将是这样的:

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

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

我写了一个脚本,注入APK所需的例外,并允许使用Charles Proxy与应用程序。

这是Github https://github.com/levyitay/AddSecurityExceptionAndroid

我在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 proxy SSL的链接。

在你的手机上:

  1. Wifi Settings > Modify Network > Advanced Options 。 将“代理服务器Manual设置为“ Manual ,然后分别将从Charles收到的IP和端口号inputProxy hostnameProxy port

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

  3. 在您的浏览器上,转到步骤3中的链接,下载所需的证书(如果它不适用于Chrome,请下载海豚浏览器)。您可以用任何名称命名您的证书。

回到Charles Proxy上:

  1. 如果您的设置默认为提示您进行远程连接,您应该得到AllowDeny您的电话使用代理的提示。

你现在可以在牛轧糖7.1.1上使用Charles。