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。
我有一个 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。