У меня есть фрагмент кода, который отправляет письмо с предварительно подписанным URL-адресом S3, который я генерирую в Java с использованием AWS SDK (1.11.482), например:
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 часа.Как ни странно, если я посмотрю на фактический URL:
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 без установленного срока действия.