如何获得与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证书安装为可信,而不是其证书+私钥。
这个问题是由两个因素造成的:
-
不仅安装MiTM代理的CA证书,还安装其私钥(从而使设备上的VPN应用程序能够解密来自其他应用程序的MiTMnetworkingstream量)。 您不需要设备上的MiTM代理的私钥。
-
Android Nougat更改了
Settings -> Security -> Install from storage
stream程Settings -> Security -> Install from storage
除了证书以外还包含私钥的文件。 这种行为的变化揭露了上述问题。
在使用Nougat之前,除了证书之外,还包括Settings -> Security -> Install from storage
stream程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 storage
stream程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的总体“如何”将是这样的:
- configurationWiFi +代理(Charles是如何要求的)。 连接它。
- 在设备上,导航到http://charlesproxy.com/getssl ,接受请求下载.pem,然后按“打开”,它启动“证书安装程序”的应用程序。 使用它作为“VPN和应用程序”安装证书。
- 在Manifest.xml中将属性
android:networkSecurityConfig="@xml/network_security_config"
放到<application>
- 使用第一篇文章的内容创buildres / xml / network_security_config.xml(这是完全正确的)。
- 启动查尔斯和应用程序,玩得开心。
PS检查设备上的date/时间。 这应该是正确的。
我写了一个脚本,注入APK所需的例外,并允许使用Charles Proxy与应用程序。
这是Github https://github.com/levyitay/AddSecurityExceptionAndroid
我在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 proxy SSL的链接。
在你的手机上:
-
Wifi Settings > Modify Network > Advanced Options
。 将“代理服务器Manual
设置为“Manual
,然后分别将从Charles收到的IP和端口号inputProxy hostname
和Proxy port
。 -
(可选)您可能或不可以访问Charles提供的chls.pro/ssl链接。 在我的设备上,我总是被告知我没有networking连接。 我将charlesproxy.com添加到字段的
Bypass proxy for
。 -
在您的浏览器上,转到步骤3中的链接,下载所需的证书(如果它不适用于Chrome,请下载海豚浏览器)。您可以用任何名称命名您的证书。
回到Charles Proxy上:
- 如果您的设置默认为提示您进行远程连接,您应该得到
Allow
或Deny
您的电话使用代理的提示。
你现在可以在牛轧糖7.1.1上使用Charles。