与AWS / alive.json的Android HTTPS连接挂起

时间:2017-09-20 11:49:56

标签: java android ssl https

我手上有一个针对SDK级别为21的Android应用。我正在尝试使用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以及其他DigiCerts - 这是否足够?)
  • 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没有帮助解决这个问题。请注意,这只是一个绝望的措施,而不是生产的东西 - 显然我们不想在亚马逊的证书更新时打破。

1 个答案:

答案 0 :(得分:0)

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