首页 > 解决方案 > Java中PresignedURL的SignatureDoesNotMatch

问题描述

public S3PresignedURLServiceImpl() {
        amazonS3Client = AmazonS3ClientBuilder
                .standard()
                .withCredentials(new DefaultAWSCredentialsProviderChain())
                .withRegion(S3PresignedURLConstants.DEFAULT_REGION)
                .build();
    }

[在本地它正在工作,但是当 lambda 部署在控制台上时

SignatureDoesNotMatch 我们计算的请求签名与您提供的签名不匹配。检查您的密钥和签名方法。

try {
    // Set the pre-signed URL to expire after specified time.
    java.util.Date expiration = new java.util.Date();
    long expTimeMillis = expiration.getTime();
    if(data.getExpiryTime() > 0) {
        expTimeMillis += 1000 * 60 * data.getExpiryTime();
    } else {
        expTimeMillis += 100 * 60 * 60 * 6;
    }
    expiration.setTime(expTimeMillis);
    HttpMethod httpMethod = data.isUpload()?HttpMethod.PUT:HttpMethod.GET;

    Logger.logInfo("Generating pre-signed URL.",REPORTER);
    GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(data.getBucketName(), data.getFilePath())
            .withMethod(httpMethod)
            .withExpiration(expiration);
    if(!data.isUpload())
        generatePresignedUrlRequest.withVersionId(data.getVersionId());
    else generatePresignedUrlRequest.withContentType(data.getContentType());

    url = amazonS3Client.generatePresignedUrl(generatePresignedUrlRequest);
    responseData.setPreSignedUrl(url.toString());
}
catch(Exception e) {
    throw new S3PresignedURLException(e.getMessage(), e);
}

截屏

标签: javaamazon-web-servicesamazon-s3aws-sdkpre-signed-url

解决方案


请检查 library 的版本org.apache.httpcomponents:httpclient,如果是4.5.74.5.8,请尝试降级到4.5.6,因为 AWS SDK S3 存在问题。有关更多详细信息,请查看Amazon S3 签名不匹配 - AWS 开发工具包 Javaorg.apache.httpcomponents:httpclient:4.5.7 中断获取 S3 对象


推荐阅读