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库。
知道我在做什么错吗?
-
作为一项快速测试,请尝试将user添加/移动到中,看看是否有影响。它不应该,但是只需要一点时间就可以尝试。
-
您是否需要在developer.android.com/training/articles/security-config.html中添加用于Charles的显式CA:信任其他CA,因为Charles CA是自己生成的,并且不在Android System信任链中?
-
@Morisson Chang:我不想将Charles CA嵌入到应用程序中,我希望能够像以前一样在开发电话上手动添加它。来自Settings -> Security -> Install from storage
-
1.您如何在应用程序AndroidManifest.xml中引用network_security_config.xml? 2.您可以链接.pfx文件吗?我认为它只包含CA证书(没有私钥),因此应该可以发布。我问是因为,如果.pfx包含私钥,它将被假定为客户端证书文件,因此来自该文件的CA不会被安装为受信任的服务器身份验证。
-
@Alex Klyubin:我的原始.pfx文件确实包含一个私钥。我刚切换到.crt且仅带一个证书。到目前为止没有运气。我会加倍努力,重新启动所有设备,并保持更新。
-
@AlexKlyubin hurra,它现在正在工作:)。我想我需要重启我的查尔斯或应用程序或其他任何东西。我很困惑,因为在牛轧糖之前,我已经在无数的android设备上安装了相同的.pfx文件,并且它们被识别还可以。但是现在一切都很好。您能写一个答案让我批准吗?
解决方案是不使用.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和应用程序,玩得开心。
附言检查设备上的日期/时间。应该是正确的。
-
关于这个好答案的重要说明:如果您的应用程序针对API 23或更低版本,则不需要步骤3和4。实际上,如果您具有API 23或更低版本,则将无法编译network-security-config内容。
-
这是Android 7.0的绝佳解决方案。比官方的Charles Proxy信息清晰得多。
-
在7.1.1中,可能只有我自己,但这些步骤对我不再有用。我最近做了一个更新
-
@satyajit此解决方案适用于Google Pixel上的Android 7.1.1。
-
有或没有第3步和第4步?
-
我处于这种奇怪的状态,在下载证书后,点击证书要求输入PIN,即使多次输入正确的PIN之后,我都没有反应(Motorola 7.0)。我尝试删除设备上的PIN码,然后重新启动,每次进入"确认您的PIN码"时都尝试相同的步骤,然后才被删除。
-
@vikramvi,电话可能出现问题。您尝试过另一种吗?
-
如果我想查看代理日志而不是从我的应用程序看到怎么办?我无法执行步骤3,该怎么办?
根据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连接,否则该应用的调试版本将无法正常工作。
-
关于PS:文档显示Trust anchors specified in debug-overrides are added to all other configurations。因此,我给人的印象是它已添加到base-config而不是完全替换了?
-
哦,你说的对。您无需在调试覆盖中明确列出"系统"信任锚。
-
这个答案还不清楚。请参考下面的@stkents答案。
-
同意这个答案可以解释正在发生的事情,但是还不清楚一个人应该做什么。
我使用的是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 hostname和Proxy port。
(可选)您可能无法访问Charles先前提供的chls.pro/ssl链接。在我的设备上,始终会通知我没有网络连接。我将charlesproxy.com添加到Bypass proxy for字段。
在您的浏览器上,转到第3步中的链接,然后下载所需的任何证书(如果该证书在Chrome上不起作用,请下载Dolphin Browser)。您可以使用任意名称命名证书。
回到Charles Proxy:
如果默认情况下您的设置会提示您进行远程连接,则应该提示您使用Allow或Deny电话使用代理。
您现在可以在Nougat 7.1.1上使用Charles。