android - HttpURLConnection SSL 握手因 AWS 签名 URL 重定向而中止

标签 android ssl nginx amazon-s3 hapi.js

我正在尝试使用 Android 的 HttpURLConnection 从 Amazon S3 服务器下载文件,但收到 SSLException。我们的服务器是在 Nginx 后面运行的 Node.js 服务器 (Hapi)。该应用程序从我们的服务器请求文件,服务器以 302 重定向回复到 S3 服务器上资源的签名 URL。使用重定向回复的代码是:

        var params = {
            Bucket: bucketID, 
            Key: fullPath
        };
        var s3 = new AWS.S3({ apiVersion: '2006-03-01' });
        s3.getSignedUrl('getObject', params, function (err, url)
        {
            if (err || !url)
            {
                return reply(Boom.notFound());
            }

            return reply.redirect(url);

        });

使用浏览器或 curl 工作正常并正确重定向到 S3 并下载文件,但在使用 HttpURLConnection 的 Android 上(同样的问题也发生在 HttpClient 上),我得到一个 SSLException:

javax.net.ssl.SSLException: SSL handshake aborted: ssl=0x7148d680: I/O error during system call, Connection reset by peer

知道是什么原因造成的吗?

最佳答案

没关系 - 这是应用程序支持的 TLS 版本与服务器支持的 TLS 版本不匹配。服务器是为 TLSv1.1 和 TLSv1.2 设置的,我猜默认情况下 HttpURLConnection 和 HttpClient 是为 TLSv1.0 设置的。我已更改为 HttpClient,因此添加以下代码解决了问题:

        SSLContext sslContext = SSLContexts.createDefault();
        SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContext,
                                                                          new String[]{"TLSv1.1", "TLSv1.2"},
                                                                          null,
                                                                          new NoopHostnameVerifier());
        CloseableHttpClient client = HttpClientBuilder.create()
                .setDefaultCookieStore(cookieStore)
                .setSSLSocketFactory(sslConnectionSocketFactory)
                .build();

关于android - HttpURLConnection SSL 握手因 AWS 签名 URL 重定向而中止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36489741/

相关文章:

Android wrap_content 不起作用 - 它太大了

java - 如何在涉及 Fragment 的 Android 代码中找到空指针错误

php - 通过 curl 和 php 连接到一个端口地址

ssl - 获取网站的 https 证书时出现问题

ssl - 1and1 HTTPS 重定向不起作用,但 HTTP 可以

ssl - 在 Jelastic 的容器外使用 SSL 证书文件

http - 如何设置nginx仅在修改时传输静态文件

Docker 与 nginx 组合不断显示欢迎页面

android - 如何使用 ViewPager 的 fragment 首选项?

android - 为什么 Android 对 ConstraintLayout 使用单独的 xmlns