android - 最新 Android SDK 和模拟器上的 Charles SSL 代理问题

标签 android ssl charles-proxy

我不知道这是否与更新 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很多次,我尝试删除模拟器(API 23 和 24)并重新安装新的模拟器,我什至尝试升级构建工具并将 sdk 版本编译为 24 并使用 Java 8。我还尝试升级到 Charles 4 和重新安装根证书。

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

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

enter image description here

如果我在 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)

需要注意的更重要的一点是,相同的设置在使用相同 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.htmlhttps://developer.android.com/training/articles/security-config.html

关于android - 最新 Android SDK 和模拟器上的 Charles SSL 代理问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39273266/

相关文章:

android - Google Play 不会自动更新内部应用

charles-proxy - 查尔斯 iphone 代理

sockets - 使用 Tor 套接字通过 ssl 访问 imap

ios - 在 Charles 中建立 200 连接但无法看到 Https 的响应内容

api - 打开 Charles 代理时无法访问网站 (Windows 10)

android - .apk 文件是否足以将应用程序安装到我的 Android 手机?

android - 如何选择最佳图像大小以不超过 VM 预算?

javascript - 如何在 HTML 5 中将网络摄像头流式传输到客户端

c# - WCF 和 SSL 相互身份验证 403 - 禁止 : Access is denied

c# - MS Windows 服务和 https