【发布时间】:2023-03-11 13:41:01
【问题描述】:
我手头有一个 Android 应用,针对 SDK 级别 21。我正在尝试使用 java.net.HttpURLConnection 连接到 AWS' alive.json。
信任链如下所示:
- Baltimore CyberTrust 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 CyberTrust Root。它没有解释挂起。 -
你用过这些CA的证书吗?在这种情况下可能是#1问题? “这可能是因为您拥有来自新 CA 的证书,但 Android 尚未信任该证书”。我想不出另一个原因
-
感谢您的帮助。 TBH,这是我第一次在这个级别上对 SSL 证书进行推理。 Baltimore CyberTrust Root 是系统受信任的凭证。 DigiCert Baltimore CA-2 G2 不是,只是 OP 中提到的那些近距离匹配。
-
顺便说一句——在同一设备上将相同的地址打入 Chrome 可以很好地下载文件,这是我认为系统的受信任证书不会有问题的另一个原因。