我有一段代码可以发送带有预先签名的S3 URL的邮件,该邮件是我使用AWS SDK(1.11.482)在Java中生成的,如下所示:
ZonedDateTime expiration = ZonedDateTime.now();
expiration = expiration.plusDays(7);
GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(<Bucket>, <Key>).withMethod(HttpMethod.GET)
.withExpiration(Date.from(expiration.toInstant()));
AmazonS3 amazonS3Client = AmazonS3ClientBuilder.standard().withRegion(<Region>)
.withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(<AccessKey>, <SecretKey>))).build()
String s3Url = amazonS3Client.generatePresignedUrl(generatePresignedUrlRequest).toString();
但是,它不会在7天后过期,而是在约24小时后过期。奇怪的是,如果我查看实际的网址:
https://<AWS S3 Url>
?X-Amz-Security-Token=<Token>
&X-Amz-Algorithm=AWS4-HMAC-SHA256
&X-Amz-Date=20190117T072701Z
&X-Amz-SignedHeaders=host
&X-Amz-Expires=604799
&X-Amz-Credential=<Credential>aws4_request
&X-Amz-Signature=<Signature>
然后,到期时间戳实际上就是我所期望的。但是即使在24小时后访问它,我也会得到:
<Error>
<Code>ExpiredToken</Code>
<Message>The provided token has expired.</Message>
<Token-0>
FQoGZXIvYXdzEPD//////////wEaDNkjQqZnq1LsP/9OCCKIAtq5Au7PKYSxzcqpwPlTF9DH3oyOrjo2Zft91L1pkCKX5VXHCFPClo0b0V5jo+GaNjHBLNYWN7lrUJm+20hOPURxvP/7ytZ5w5L3kk0DiisDdqPlup4xBUXGAOXqnQrjd7CqV6R0cr+8AD+tEh8QXZFxz//VCYKviFRA3vO/fIimuRq9Os4CACXLuuEU3GDKpDkhoHSN70tgmxMr2xBD6Wlo2UFClSUOt5pNzbSAjgD896fWSqf3C5DbZVAuasK/z2IOAI0OG6N/auOnsBBkLJ23nLvHrjzgnJZaKO/JSaG4PF0jyOphED8fvQ1V5P8xm2gDKT/shv1U1IQLYJjRVzZySdpStZMJfCiwxYDiBQ==
</Token-0>
<RequestId>23CFB9FB0973C599</RequestId>
<HostId>
G4tEmvGfauxHfkcyuGgTDJ+JxAJ4DEO6WPcDwBWkDBMLnw0R1cdTepUFHbIGmSF/FeV/oYnSq7c=
</HostId>
</Error>
注意:访问权限和秘密密钥与IAM用户相关联,没有设置有效期限。
答案 0 :(得分:-1)
要创建一个有效期最长为7天的预签名URL,请首先将IAM用户凭据(访问密钥和秘密访问密钥)指定给您正在使用的SDK(这似乎是您的Java AWS SDK)案件)。然后,使用 AWS签名版本4 生成一个预签名URL。
以下是Boto在python中的示例:
import boto3
from botocore.client import Config
# Get the service client with sigv4 configured
s3 = boto3.client('s3', config=Config(signature_version='s3v4'))
此外,我知道您提到过它,但是您需要确保直接使用IAM用户而不是IAM角色使用的凭据,因为它们的令牌每24-36小时轮换一次。