【问题标题】:S3Exception: The request signature we calculated does not match the signature you providedS3Exception:我们计算的请求签名与您提供的签名不匹配
【发布时间】:2021-10-15 19:25:29
【问题描述】:

我有不同的对象生成保存在 S3 中的文件。每个对象调用以下函数来保存文件。

我只有少数对象有以下问题。对象要么总是保存文件,要么永远不能保存文件。

    /**
     * Upload a file (with metadata).
     *
     * @param bucketId    the id of the bucket
     * @param key         the key of the file
     * @param inputStream the content of the file
     * @param metadata    the metadata of the file
     * @return the eTag of the uploaded file
     * @throws IOException If an error occurs during the file upload
     */
    public String upload(String bucketId, String key, InputStream inputStream, Map<String, String> metadata) throws IOException {
        LOG.info("Upload file {} on bucket {} with metadata: {}", key, bucketId, metadata);
        CreateMultipartUploadRequest.Builder builder = CreateMultipartUploadRequest.builder();
        if (!this.encryptionAlgorithm.equalsIgnoreCase("none")) {
            builder = builder.serverSideEncryption(this.encryptionAlgorithm);
        }
        CreateMultipartUploadRequest createMultipartUploadRequest = builder.bucket(bucketId)
            .key(key)
            .metadata(metadata)
            .build();

        CreateMultipartUploadResponse createMultipartUploadResponse = s3Client.createMultipartUpload(createMultipartUploadRequest);
        String uploadId = createMultipartUploadResponse.uploadId();

        try {
            List<CompletedPart> parts = uploadFileParts(bucketId, key, uploadId, inputStream);

            CompleteMultipartUploadRequest completeMultipartUploadRequest = CompleteMultipartUploadRequest.builder()
                .bucket(bucketId)
                .key(key)
                .uploadId(uploadId)
                .multipartUpload(CompletedMultipartUpload.builder().parts(parts).build())
                .build();
            CompleteMultipartUploadResponse completeMultipartUploadResponse = s3Client.completeMultipartUpload(completeMultipartUploadRequest);

            return completeMultipartUploadResponse.eTag();
        } catch (Exception e) {
            LOG.error("Error while uploading {} multipart {} on bucket {} with metadata {}", key, uploadId, bucketId, metadata, e);

            s3Client.abortMultipartUpload(AbortMultipartUploadRequest.builder()
                .bucket(bucketId)
                .key(key)
                .uploadId(uploadId)
                .build());

            throw e;
        }
    }

错误是

我们计算的请求签名与您提供的签名不匹配。检查您的 AWS 秘密访问密钥和签名方法。有关详细信息,请参阅 REST 身份验证和 SOAP 身份验证了解详细信息。 (服务:S3,状态码:403,请求 ID:79b6c0a2-0d74-1f30-a4bf-246e9631ccd8,扩展请求 ID:null)

我验证一下,bucket 永远是同一个值,输入流数据包含文件的数据。数据成功传输到 S3 存储桶。密钥总是像eventsnapshot-21234-7-2021-08-12-1628767690000.jpg

你有过这样的问题吗?

【问题讨论】:

    标签: java amazon-s3 aws-sdk-java-2.0


    【解决方案1】:

    我发现了问题。如果元数据值末尾有空格,则AWS SDK生成的签名与服务器返回的签名不同。

    可能 S3 会修剪元数据的名称和值。

    后来我在 aws-sdk-go 中也发现了一个类似的问题:https://github.com/aws/aws-sdk-go/issues/2448

    我正在使用版本 2.15.36 的 aws-sdk-java。我不知道它是否在较新版本的 SDK 中得到修复。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-17
      • 2022-01-18
      • 2014-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-23
      相关资源
      最近更新 更多