【问题标题】:Android HTTPS connection to AWS/alive.json hangs到 AWS/alive.json 的 Android HTTPS 连接挂起
【发布时间】:2023-03-11 13:41:01
【问题描述】:

我手头有一个 Android 应用,针对 SDK 级别 21。我正在尝试使用 java.net.HttpURLConnection 连接到 AWS' alive.json

信任链如下所示:

  • Baltimore Cyber​​Trust Root(受开发设备信任)
  • DigiCert Baltimore CA-2 G2(开发设备信任 DigiCert Assured ID Root G2、Global Root CA、Global Root G2 以及其他 DigiCert - 这是否足够?)
  • AWS (*.us-east-etc.amazonaws.com)

我的 AndroidManifest.xml 功能 <uses-permission android:name="android.permission.INTERNET"/>.

代码 [归结为] 如下。它在来自 NDK 的单独线程上调用(它一个一个地执行请求 - 现在只有这个)。

    // init() -- all optional
    System.setProperty("http.keepAlive", "false");
    HttpURLConnection.setDefaultAllowUserInteraction(false);

    // makeRequest(HttpRequest request)
    URL url = new URL(request.url);
    HttpURLConnection http = (HttpURLConnection) url.openConnection();
    http.setUseCaches(false);
    http.setReadTimeout(timeoutMs);
    http.setChunkedStreaingMode(0); // optional
    http.setDoInput(true);
    http.setRequestMethod("GET"); // optional
    http.setRequestProperty("X-Correlation-ID", x); // optional
    http.connect();

现在,如果我将超时设置为 80 毫秒,我将得到一个 javax.net.ssl.SSLHandshakeException: SSL handshake timed out。超过此时间(800 毫秒),它将永远挂在http.connect()

https://developer.android.com/training/articles/security-ssl.html#HttpsExample 和周围的文章详细说明了应该如何做到这一点。我的理解是这个练习不需要证书固定。

如果我确实添加了一个(按照上述文章的内容),我会得到一个javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.

连接到 http:// 资源就可以了。

我做错了什么?我需要什么额外的配置,为什么?

更新:

1,基于 OkHttp 的实现表现出完全相同的行为。

2, Certificate pinning 没有帮助解决这个问题。请注意,这只是一个绝望的措施,而不是用于生产的东西 - 显然我们不想在亚马逊的证书更新时破坏。

【问题讨论】:

  • 您是否已经检查了您报告的链接上报告的 3 个可能问题?
  • 在我看来这是错误的方向,我不应该需要自定义 SSL 配置。 FWIW,我已经检查过了。从上面的信任链中,我得出结论,它不是#1。但是我使用了自签名证书(不应该有),这可能导致#2。 #3 -- openssl s_client -connect s3.us-east-2.amazonaws.com:443 给了我 pastebin.com/vZcP4yjz ,我的设备信任 Baltimore Cyber​​Trust Root。它没有解释挂起。
  • 你用过这些CA的证书吗?在这种情况下可能是#1问题? “这可能是因为您拥有来自新 CA 的证书,但 Android 尚未信任该证书”。我想不出另一个原因
  • 感谢您的帮助。 TBH,这是我第一次在这个级别上对 SSL 证书进行推理。 Baltimore Cyber​​Trust Root 是系统受信任的凭证。 DigiCert Baltimore CA-2 G2 不是,只是 OP 中提到的那些近距离匹配。
  • 顺便说一句——在同一设备上将相同的地址打入 Chrome 可以很好地下载文件,这是我认为系统的受信任证书不会有问题的另一个原因。

标签: java android ssl https


【解决方案1】:

哦。不要这样做 [在 Android 上];使用http://s3.us-east-2.amazonaws.com/static-us-east/alive.json,而不是https://

【讨论】:

    猜你喜欢
    • 2011-07-01
    • 2012-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-29
    • 1970-01-01
    • 2018-11-28
    相关资源
    最近更新 更多