当我尝试将图像上传到 S3 时,出现以下错误。它说签名与提供的签名不匹配。
com.amazonaws.services.s3.model.AmazonS3Exception:我们计算的请求签名与您提供的签名不匹配。检查您的密钥和签名方法。如果您在将 SDK 升级到 1.12.460 或更高版本后开始看到此问题,可能是因为提供的存储桶包含“/”。请参阅 https://github.com/aws/aws-sdk-java/discussions/2976 了解更多详细信息(服务:Amazon S3;状态代码:403;错误代码:SignatureDoesNotMatch;请求 ID:4SSPSNRN59QZNYD5;S3 扩展请求 ID :9+4X7GMOZqKIxuaHUBxB09grlgcY7qsxa0y7kGdxnsXBYKDSmGMpjhxlDj/tkOaYIM83npONvWo=;代理:空)。
这是我的亚马逊配置文件:
@Configuration
public class AmazonConfig {
@Bean
public AmazonS3 s3(){
AWSCredentials awsCredentials = new BasicAWSCredentials(
"xxx","xxxxx"
);
return AmazonS3ClientBuilder
.standard()
.withCredentials(new AWSStaticCredentialsProvider(awsCredentials))
.withRegion("eu-central-1")
.build();
}
}
我仔细检查了一下,密钥不包含任何/。区域是正确的,我定义存储桶的名称也是正确的。
public enum XeramedBucket {
BUCKET("xeramedimages");
private final String xeramedBucket;
XeramedBucket(String xeramedBucket){
this.xeramedBucket = xeramedBucket;
}
public String getXeramedBucket() {
return xeramedBucket;
}
}
我的机器时钟也同步了。 这是依赖版本:
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk</artifactId>
<version>1.12.685</version>
</dependency>
我希望用户上传图像 s3 并将目录保存到数据库。
您遇到的错误,
SignatureDoesNotMatch
,通常是由于计算出的签名与提供的签名不匹配时出现身份验证问题而发生的。您似乎已经排除了一些常见原因,例如不正确的密钥、存储桶名称和时钟同步。
但是,您构建 S3 客户端的方式可能会导致问题。 AWS SDK for Java 版本 1.12.460 及更高版本引入了与处理包含“/”的存储桶相关的更改。这些存储桶名称的 URL 编码可能与之前的行为不匹配,从而导致身份验证失败。
以下是您可以修改
AmazonConfig
类以根据此更改正确配置 S3 客户端的方法:
@Configuration
public class AmazonConfig {
@Value("${amazon.access.key}")
private String awsAccessKey;
@Value("${amazon.secret.key}")
private String awsSecretKey;
@Bean
public AmazonS3 s3Client() {
AWSCredentials awsCredentials = new BasicAWSCredentials(awsAccessKey, awsSecretKey);
return AmazonS3ClientBuilder.standard()
.withCredentials(new AWSStaticCredentialsProvider(awsCredentials))
.withRegion(Regions.EU_CENTRAL_1)
.build();
}
}
然后,确保您在应用程序属性或 YAML 文件中正确配置了访问密钥和秘密密钥:
amazon.access.key=YOUR_ACCESS_KEY
amazon.secret.key=YOUR_SECRET_KEY
此外,请确保您已为所使用的访问密钥设置 S3 存储桶的适当权限,包括读取和写入权限。
如果您在进行这些修改后仍然遇到问题,请仔细检查存储桶名称并确保它符合所需的命名约定。此外,请考虑检查存储桶名称中是否存在可能导致问题的特殊字符或空格。
如果问题仍然存在,您可能需要启用 AWS SDK 日志记录以获取有关发送到 S3 的请求的更多详细信息,这有助于进一步排除故障。