Java的Amazon S3 SDK - 配置TLSv1.2

6
我有一个基本的Amazon S3 SDK代码片段,用于检索存储桶列表。服务器配置为仅接受TLSv1.2。我无法配置客户端发送TLS v1.2请求,调试显示客户端始终发送TLSv1。我尝试设置系统属性,但也不起作用。
-Dhttps.protocols=TLSv1.2
        BasicAWSCredentials credentials = new BasicAWSCredentials(username,password);

        AmazonS3 s3 = new AmazonS3Client(credentials);
        final String serviceurl = "https://ip:port";
        s3.setEndpoint(serviceurl);
        S3ClientOptions s3ClientOptions = new S3ClientOptions();
        s3ClientOptions.setPathStyleAccess(false);
        s3.setS3ClientOptions(s3ClientOptions);

        for (Bucket bucket: s3.listBuckets()) {
            System.out.println("Bucket name::" + bucket.getName());
        }

我这里漏掉了什么?如何配置代码以始终发送TLSv1.2请求?我正在使用AWS SDK 1.7.25。感谢您的帮助。

2个回答

4

AWS Java SDK 1.9.4版本将TLSv1.2作为默认值

然而,在1.9.14版本之前,该枚举并不存在(代码在这里)。我建议至少使用该版本

我认为可以注入此信息,但是需要做很多工作。这里可能会有一点遗漏:

import org.apache.http.conn.ssl.SSLSocketFactory;
import com.amazonaws.ApacheHttpClientConfig;
import com.amazonaws.ClientConfiguration;

SSLContext ctx = SSLContext.getInstance("TLSv1.2");
SSLSocketFactory socketFactory = ctx.engineGetSocketFactory();

ClientConfiguration client = new ClientConfiguration();
ApacheHttpClientConfig apacheClient = client.getApacheHttpClientConfig();
SSLSocketFactory socketContext = apacheClient.getSslSocketFactory();
apacheClient.setSslSocketFactory(socketFactory);

注入来源:

注意:本文中的链接提供了关于注入的更多信息。

2
我找到了这个问题的根本原因。如果设置了-Dcom.amazonaws.sdk.disableCertChecking=true,Amazon S3 SDK将始终使用TLS。我之前使用了这个标志。当我去掉它时,就会使用TLSv1.2。 - user3566773

1
在Amazon SDK中,将系统属性设置为false。
(SDKGlobalConfiguration.DISABLE_CERT_CHECKING_SYSTEM_PROPERTY, "false");

如果您勾选了它,它将内部设置com.amazonaws.sdk.disableCertChecking为false。
我遇到了类似的问题,并查阅了同样的问题。用户3566773发表的评论帮助了我,因此我认为这必须作为答案发布。
希望它有所帮助!

这个评论真是救了我一命。同时,你可以通过JVM参数来禁用或启用它。禁用有时对于烟雾/集成测试非常有用。 -Dcom.amazonaws.sdk.disableCertChecking=true - Copy and Paste

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接