AWS Java SDK SSL 证书

5

我有一个连接到AWS的JBoss AS7,并特别使用AWS SDK for Java连接到S3,我拥有访问密钥和秘密密钥,一切都运行良好。 我使用S3进行各种文件共享。

JBoss的数据源连接到AWS RDS。 我已为数据源启用了SSL加密-我在我的standalone.xml中配置了我的truststore中的,并且我的RDS数据源连接并验证SSL没有问题。 但是,当我尝试通过SDK连接到S3(启用了带有RDS证书的truststore时),出现以下异常:

Caused by: com.amazonaws.SdkClientException: Unable to execute HTTP request: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

因此,未启用信任存储:我可以通过SDK连接到S3,一切正常。 当我启用具有RDS证书的truststore时:我的SDK -> S3连接会中断。

我无法确定需要添加哪个证书到信任存储中,以便SDK可以工作,或者是否需要以某种方式配置SDK来使用TLS。

3个回答

3

Ognjen的回答帮助我解决了这个问题。我遇到了同样的问题,问题是由于AWS SDK使用我为RDS连接构建的自定义信任库造成的。我通过显式设置javax.net.ssl.trustStore参数来指定自定义信任库。

我采取的解决方案: 我使用文档中提供的脚本将rds-combined-ca-bundle.pem导入到$JAVA_HOME/lib/security/cacerts中(如果您安装了JDK,则可以在jre/lib/security文件夹中找到cacerts文件)。然后我删除了之前设置的javax.net.ssl.trustStore参数。然后Java开始使用默认的cacerts文件,现在一切都好了。

Java默认信任库的默认密码是changeit


默认密码是 changeit 而不是 chageit,如果有人遇到问题,请注意。 - aabceh

1

Ognjen和Asanka建议在整个应用程序(或应用程序服务器)中使用相同的truststore,但这在某些情况下并不适用。但是,AWS Java SDK通过ClientConfiguration提供ApacheHttpClientConfig来影响Apache HTTP客户端,例如:

import com.amazonaws.ApacheHttpClientConfig;
import com.amazonaws.ClientConfiguration;
import com.amazonaws.http.conn.ssl.SdkTLSSocketFactory;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import org.apache.http.conn.socket.ConnectionSocketFactory;

SSLContext myContext = ...
HostnameVerifier myVerifier = ...

ConnectionSocketFactory factory = new SdkTLSSocketFactory(myContext, myVerifier);

ClientConfiguration clientConfiguration = new ClientConfiguration();
clientConfiguration.getApacheHttpClientConfig().setSslSocketFactory(factory);

AmazonS3 s3client = AmazonS3ClientBuilder.standard()
    .withClientConfiguration(clientConfiguration)
    .build();

编辑:另请参阅StackOverflow问题#47913449


谢谢,AWS S3 Java SDK 2.x 中是否有可能实现这个功能?请提供代码参考。 - Jay

1
我发现问题所在:没有为我的jboss定义任何自定义truststore意味着AWS SDK从$JAVA_HOME/lib/security/cacerts中拉取常规cacerts truststore。定义自己的truststore(其中缺少来自cacerts truststore的所有证书)-意味着AWS SDK没有地方获取常规证书。
因此,解决方法是:将我的rds-ca-2019-root.pem导入上述提到的cacerts文件,并将其链接为我的standalone.xml中的服务器truststore。

你是怎么链接它的?我正在经历同样的问题。 - Gabriel Robaina
@GabrielRobaina 或许可以参考这个链接:https://dev59.com/uHI95IYBdhLWcg3w1BdN? - Ognjen Mišić
我不记得了,因为已经有一段时间了:/ - Ognjen Mišić

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