1

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

线程“主”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();时它只返回一个空列表 - 没有任何例外。

控制台输出为:

2019 年 7 月 3 日 8:48:07 NACHM。com.amazonaws.http.AmazonHttpClient createSocketFactoryRegistry 警告:已明确禁用端点的 SSL 证书检查。2019 年 7 月 3 日 8:48:08 NACHM。com.amazonaws.auth.profile.internal.BasicProfileConfigLoader loadProfiles 警告:您的配置文件名称包含“配置文件”前缀。这被认为是 Java SDK 中配置文件名称的一部分,因此当您从 Java 代码中引用此配置文件时,您需要在配置文件名称中包含此前缀。2019 年 7 月 3 日 8:48:08 NACHM。com.amazonaws.auth.profile.internal.BasicProfileConfigLoader loadProfiles 警告:您的配置文件名称包含“配置文件”前缀。这被认为是 Java SDK 中配置文件名称的一部分,因此,当您从 Java 代码中引用此配置文件时,您需要在配置文件名称中包含此前缀。2019 年 7 月 3 日 8:48:23 NACHM。com.amazonaws.http.AmazonHttpClient createSocketFactoryRegistry 警告:已明确禁用端点的 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 个文件。

控制台输出为:

2019 年 7 月 3 日 8:48:07 NACHM。com.amazonaws.http.AmazonHttpClient createSocketFactoryRegistry 警告:已明确禁用端点的 SSL 证书检查。2019 年 7 月 3 日 8:48:08 NACHM。com.amazonaws.auth.profile.internal.BasicProfileConfigLoader loadProfiles 警告:您的配置文件名称包含“配置文件”前缀。这被认为是 Java SDK 中配置文件名称的一部分,因此当您从 Java 代码中引用此配置文件时,您需要在配置文件名称中包含此前缀。2019 年 7 月 3 日 8:48:08 NACHM。com.amazonaws.auth.profile.internal.BasicProfileConfigLoader loadProfiles 警告:您的配置文件名称包含“配置文件”前缀。这被认为是 Java SDK 中配置文件名称的一部分,因此,当您从 Java 代码中引用此配置文件时,您需要在配置文件名称中包含此前缀。2019 年 7 月 3 日 8:48:23 NACHM。com.amazonaws.http.AmazonHttpClient createSocketFactoryRegistry 警告:已明确禁用端点的 SSL 证书检查。

有什么建议吗?

4

1 回答 1

2

所以我终于回答自己了。

使用禁用端点验证

System.setProperty(SDKGlobalConfiguration.DISABLE_CERT_CHECKING_SYSTEM_PROPERTY, "true");

奇迹般有效。问题有两个原因:

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

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

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

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

干杯,

奥利

于 2019-07-12T12:49:35.357 回答