我不知道这是否与更新Android构建工具有关,因为我没有立即尝试,但我似乎无法让Charles在Android上正确地使用SSL代理(它以前工作得很好)。
简而言之,如果我在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)
当然,我检查了我们的服务器证书(它们没有过期)。我已经检查了setup很多次,我尝试删除模拟器(API23和24)并重新安装新的,我甚至尝试升级构建工具和编译sdk版本到24并使用Java8。我还尝试升级到Charles 4并重新安装根证书。
keytool -list -keystore
/usr/libexec/java_home/jre/lib/security/cacerts -storepass changeit
确实列出了查尔斯证书。(对于1.7和1.8 jdks)
Charles Root证书已正确安装在仿真器上,并将于2044过期
如果我在Charles上禁用SSL代理,那么在不运行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)
更重要的是要注意,相同的设置在使用相同iOS端点的api模拟器上工作得很好。因此,这肯定与Java/Android配置有关。
任何帮助都是非常感谢的。
发布于 2016-09-20 12:38:44
如果你的目标是API level 24,那么Android 7.0就会发生这种情况。现在,用户添加的CA在默认情况下是不受信任的,每个应用程序都必须明确选择加入。
要使您的应用程序信任查尔斯证书,请在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
发布于 2016-09-11 17:12:58
我最终删除了所有gradle缓存文件夹和项目.gradle文件夹
rm -rf ~/.gradle/caches
rm -rf .gradle
并强制Kotlin使用v1.0.3而不是EAP构建,这又一次起到了作用。我不完全知道这里出了什么问题。
https://stackoverflow.com/questions/39273266
复制相似问题