我手上有一个针对SDK级别为21的Android应用。我正在尝试使用java.net.HttpURLConnection
连接到AWS' alive.json。
信任链看起来像这样:
我的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没有帮助解决这个问题。请注意,这只是一个绝望的措施,而不是生产的东西 - 显然我们不想在亚马逊的证书更新时打破。
答案 0 :(得分:0)
d&#39;哦。不要[在Android上]这样做;使用http://s3.us-east-2.amazonaws.com/static-us-east/alive.json
,而不是https://
。