使用HTTPS的AWS S3 Java API无法访问S3上的存储桶

时间:2019-07-03 18:53:20

标签: java amazon-s3 https ssl-certificate radosgw

尝试访问我们的本地S3存储时,我首先遇到了证书丢失的问题:

  

线程“ main”中的异常com.amazonaws.SdkClientException:无法执行   执行HTTP请求:sun.security.validator.ValidatorException:PKIX   路径构建失败:   sun.security.provider.certpath.SunCertPathBuilderException:无法执行   找到到所请求目标的有效认证路径

关闭证书检查:

  

System.setProperty(SDKGlobalConfiguration.DISABLE_CERT_CHECKING_SYSTEM_PROPERTY,   “ true”);

我设法“连接”到服务器。但是,使用下面的代码不会产生任何结果(又称空列表)。到目前为止非常简单。

端点和存储桶名称都应该正确,因为我没有将其粘贴到(工作的)S3浏览器中。

凭据似乎也是正确的,因为当我弄乱密码时,我正在404中运行。再次-从y S3浏览器复制了那些。

使用S3浏览器,我可以访问存储桶,添加文件等等。

运行List<Bucket> buckets = s3Client.listBuckets();时,它只会返回一个空列表-没有任何异常。

控制台输出为:

  

朱利03,2019 8:48:07 NACHM。 com.amazonaws.http.AmazonHttpClient   createSocketFactoryRegistry WARNUNG:SSL证书检查   端点已被明确禁用。朱利03,2019 8:48:08 NACHM。   com.amazonaws.auth.profile.internal.BasicProfileConfigLoader   loadProfiles WARNUNG:您的个人资料名称包含“个人资料”前缀。   在Java SDK中,这被视为配置文件名称的一部分,因此您   您需要在个人资料名称中包含此前缀   从您的Java代码中引用此配置文件。 Juli 03,2019 8:48:08   NACHM。 com.amazonaws.auth.profile.internal.BasicProfileConfigLoader   loadProfiles WARNUNG:您的个人资料名称包含“个人资料”前缀。   在Java SDK中,这被视为配置文件名称的一部分,因此您   您需要在个人资料名称中包含此前缀   从您的Java代码中引用此配置文件。 Juli 03,2019 8:48:23   NACHM。 com.amazonaws.http.AmazonHttpClient createSocketFactoryRegistry   WARNUNG:端点的SSL证书检查已明确   禁用。

有什么建议吗?

System.setProperty(SDKGlobalConfiguration.DISABLE_CERT_CHECKING_SYSTEM_PROPERTY, "true");
        String accessKey = "myaccess";
        String secretKey = "mysecret";

        AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
        ClientConfiguration clientConfig = new ClientConfiguration();
        clientConfig.setProtocol(Protocol.HTTPS);

        EndpointConfiguration endpointConfig = new EndpointConfiguration("endpoint.com", Regions.EU_CENTRAL_1.getName());
        AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                .withCredentials(new AWSStaticCredentialsProvider(credentials))
                //.withRegion(defaultRegion)
                .withEndpointConfiguration(endpointConfig)
                .build();

        List<Bucket> buckets = s3Client.listBuckets();
        for (Bucket bucket : buckets) { 
                System.out.println(
                        bucket.getName() + 
                        "\t" +
                        StringUtils.fromDate(bucket.getCreationDate())
                );
        }

运行List<Bucket> buckets = s3Client.listBuckets();时,它只会返回一个空列表-没有任何异常。

(根据S3浏览器)此存储分区的根目录中有2个文件。

控制台输出为:

  

朱利03,2019 8:48:07 NACHM。 com.amazonaws.http.AmazonHttpClient   createSocketFactoryRegistry WARNUNG:SSL证书检查   端点已被明确禁用。朱利03,2019 8:48:08 NACHM。   com.amazonaws.auth.profile.internal.BasicProfileConfigLoader   loadProfiles WARNUNG:您的个人资料名称包含“个人资料”前缀。   在Java SDK中,这被视为配置文件名称的一部分,因此您   您需要在个人资料名称中包含此前缀   从您的Java代码中引用此配置文件。 Juli 03,2019 8:48:08   NACHM。 com.amazonaws.auth.profile.internal.BasicProfileConfigLoader   loadProfiles WARNUNG:您的个人资料名称包含“个人资料”前缀。   在Java SDK中,这被视为配置文件名称的一部分,因此您   您需要在个人资料名称中包含此前缀   从您的Java代码中引用此配置文件。 Juli 03,2019 8:48:23   NACHM。 com.amazonaws.http.AmazonHttpClient createSocketFactoryRegistry   WARNUNG:端点的SSL证书检查已明确   禁用。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

所以我终于要回答自己了。

使用

禁用端点验证
System.setProperty(SDKGlobalConfiguration.DISABLE_CERT_CHECKING_SYSTEM_PROPERTY, "true");

就像魅力一样。该问题有两个原因:

  1. 我的帐户没有列出存储桶的权限(不知道为什么,访问AWS S3时不会发生)。
  2. 我没有正确提供存储桶名称,因为我必须在存储桶名称中添加前导“ /”。

第1点可以通过访问对象列表来解决:

ObjectListing objects = conn.listObjects("/my_bucket_name");

第2点显然可以通过在存储桶名称中添加前导“ /”来解决。

干杯

奥利