Charles SSL代理在最新的Android SDK和模拟器上出现问题

我不知道这是否与更新的Android构建工具有关,因为我没有尝试后,但我似乎无法让查尔斯工作propery与Android代理(它工作正常之前)。

简而言之,如果我在Charles上的api端点上启用ssl代理,我会得到:

Caused by: java.security.cert.CertificateException: com.android.org.bouncycastle.jce.exception.ExtCertPathValidatorException: Could not validate certificate: Certificate expired at Wed Aug 31 10:09:00 GMT+02:00 2016 (compared to Thu Sep 01 15:18:53 GMT+02:00 2016) at com.android.org.conscrypt.TrustManagerImpl.checkTrusted(TrustManagerImpl.java:344) at com.android.org.conscrypt.TrustManagerImpl.checkServerTrusted(TrustManagerImpl.java:219) at com.android.org.conscrypt.Platform.checkServerTrusted(Platform.java:115) at com.android.org.conscrypt.OpenSSLSocketImpl.verifyCertificateChain(OpenSSLSocketImpl.java:556) at com.android.org.conscrypt.NativeCrypto.SSL_do_handshake(Native Method) at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:324) 

当然,我已经检查了我们的服务器证书(他们没有过期)。 我已经检查了很多次,我尝试删除模拟器(API 23&24)并重新安装新的,我甚至尝试过升级构建工具,编译sdk版本到24,并使用Java 8。尝试升级到查尔斯4并重新安装根证书。

keytool -list -keystore / usr / libexec / java_home /jre/lib/security/cacerts -storepass changeit列出了Charles证书。 (1.7和1.8 jdks)

Charles Root证书已正确安装在模拟器上,并在2044年过期

在这里输入图像描述

如果我在Charles上禁用SSL Proxying,那么在Charles没有运行的情况下,所有的工作都很顺利。

另外,在使用运行API 24的模拟器时,异常情况稍有不同:

 Caused by: java.security.cert.CertificateException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found. at com.android.org.conscrypt.TrustManagerImpl.verifyChain(TrustManagerImpl.java:563) at com.android.org.conscrypt.TrustManagerImpl.checkTrustedRecursive(TrustManagerImpl.java:444) at com.android.org.conscrypt.TrustManagerImpl.checkTrustedRecursive(TrustManagerImpl.java:508) at com.android.org.conscrypt.TrustManagerImpl.checkTrusted(TrustManagerImpl.java:401) at com.android.org.conscrypt.TrustManagerImpl.checkTrusted(TrustManagerImpl.java:375) at com.android.org.conscrypt.TrustManagerImpl.getTrustedChainForServer(TrustManagerImpl.java:304) at android.security.net.config.NetworkSecurityTrustManager.checkServerTrusted(NetworkSecurityTrustManager.java:94) at android.security.net.config.RootTrustManager.checkServerTrusted(RootTrustManager.java:88) at com.android.org.conscrypt.Platform.checkServerTrusted(Platform.java:178) at com.android.org.conscrypt.OpenSSLSocketImpl.verifyCertificateChain(OpenSSLSocketImpl.java:596) at com.android.org.conscrypt.NativeCrypto.SSL_do_handshake(Native Method) at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:357) 

更重要的是要注意,相同的设置在使用相同API端点的iOS模拟器上工作得很好。 所以这肯定与Java / Android配置有关。

任何帮助表示赞赏。

如果您的目标是API级别24,则会在Android 7.0中发生。现在,用户添加的CA默认情况下不受信任,每个应用程序都必须显式选择加入。

要让您的应用程序信任Charles证书,请在AndroidManifest中声明自定义网络安全配置

 <application android:networkSecurityConfig="@xml/network_security_config" > 

使用此配置在res/xml/network_security_config.xml创建文件:

 <?xml version="1.0" encoding="utf-8"?> <network-security-config> <debug-overrides> <trust-anchors> <!-- Trust user added CAs while debuggable only --> <certificates src="user" /> </trust-anchors> </debug-overrides> </network-security-config> 

更多信息: http : //android-developers.blogspot.fr/2016/07/changes-to-trusted-certificate.html和https://developer.android.com/training/articles/security-config.html

我结束了删除所有gradle缓存文件夹和项目.gradle文件夹

 rm -rf ~/.gradle/caches rm -rf .gradle 

迫使Kotlin使用v1.0.3而不是EAP构建,并且再次运行。 我不完全知道这里出了什么问题。