AWS Java SDK SSL 证书

AWS Java SDK SSL Certificates

我有一个 JBoss AS7 连接到 AWS,特别是通过 Java 的 AWS SDK 连接到 S3,我有访问密钥和密钥,一切运行良好。我用S3做各种文件分享。

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

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 证书启用信任库时:我的 SDK -> S3 连接中断。

我不知道我需要将什么证书添加到信任库以便 SDK 可以工作,或者我是否需要配置 SDK 以以某种方式使用 TLS?

所以我发现了问题所在:没有为我的 jboss 定义任何类型的自定义信任库意味着 AWS SDK 从 $JAVA_HOME/lib/security/cacerts 中提取了常规的 cacerts 信任库。定义我自己的信任库(缺少来自 cacerts 信任库的所有证书)- 意味着 AWS SDK 无法获取常规证书。

所以要解决它:我将我的 rds-ca-2019-root.pem 导入到上面提到的 cacerts 文件中,并将其作为我的服务器信任库链接到我的 standalone.xml.

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

我应用的方案: 我使用 this 文档中的脚本将 rds-combined-ca-bundle.pem 导入 $JAVA_HOME/lib/security/cacerts(如果您有 JDK 已安装。)。然后我删除了我拥有的 javax.net.ssl.trustStore 设置。然后 java 开始使用默认的 cacerts 文件,现在一切正常。

java 默认信任库的默认密码是 chageit

Ognjen 和 Asanka 提议对整个应用程序(或应用程序服务器)使用相同的信任库,这在某些情况下并不合适。但是 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();

编辑:另见 Whosebug question #47913449