我试图弄清楚我需要提供什么才能对已通过 kms 密钥使用服务器端加密进行加密的 s3 对象执行 GET 操作。当尝试对我的测试文档执行 cURL 时,出现以下错误:
使用 AWS KMS 托管密钥指定服务器端加密的请求需要 AWS 签名版本 4。
更新:添加curl的结果
$ curl -v https://s3-us-west-2.amazonaws.com/rkbtest/check.png
* Trying 54.231.185.12...
* Connected to s3-us-west-2.amazonaws.com (54.231.185.12) port 443 (#0)
* TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
* Server certificate: *.s3-us-west-2.amazonaws.com
* Server certificate: DigiCert Baltimore CA-2 G2
* Server certificate: Baltimore CyberTrust Root
> GET /rkbtest/check.png HTTP/1.1
> Host: s3-us-west-2.amazonaws.com
> User-Agent: curl/7.43.0
> Accept: */*
>
< HTTP/1.1 400 Bad Request
< x-amz-request-id: 2DECE9C69BDB8F0F
< x-amz-id-2: bs8xGSbAHksE2mSb/+r4AG3B9RlRTODasFyr5S3jMU2sNA7eJTEQr0dJTro5P2QKLRuMQtGw6tk=
< x-amz-region: us-west-2
< Content-Type: application/xml
< Transfer-Encoding: chunked
< Date: Wed, 21 Sep 2016 15:26:13 GMT
< Connection: close
< Server: AmazonS3
<
<?xml version="1.0" encoding="UTF-8"?>
* Closing connection 0
<Error><Code>InvalidArgument</Code><Message>Requests specifying Server Side Encryption with AWS KMS managed keys require AWS Signature Version 4.</Message><ArgumentName>Authorization</ArgumentName><ArgumentValue>null</ArgumentValue><RequestId>2DECE9C69BDB8F0F</RequestId><HostId>bs8xGSbAHksE2mSb/+r4AG3B9RlRTODasFyr5S3jMU2sNA7eJTEQr0dJTro5P2QKLRuMQtGw6tk=</HostId></Error>
Run Code Online (Sandbox Code Playgroud)
要使用 下载文件curl,您需要定义以下身份验证标头:
Authorization: AWS AWSAccessKeyId:Signature
Run Code Online (Sandbox Code Playgroud)
Amazon S3 REST API 使用标准 HTTP
Authorization标头来传递身份验证信息。开发人员在注册时会获得 AWS 访问密钥 ID 和 AWS 秘密访问密钥。对于请求身份验证,该
AWSAccessKeyId元素标识用于计算签名的访问密钥 ID,并间接标识发出请求的开发人员。该
Signature元素是从请求中选择的元素的 RFC 2104 HMAC-SHA1,因此Signature授权标头的部分将因请求而异。
示例 GET 请求:
GET /photos/puppy.jpg HTTP/1.1
Host: johnsmith.s3.amazonaws.com
Date: Tue, 27 Mar 2007 19:36:42 +0000
Authorization: AWS AKIAIOSFODNN7EXAMPLE:
bWq2s1WEIj+Ydj0vQ697zp+IXMU=
Run Code Online (Sandbox Code Playgroud)
PUT 请求示例:
PUT /photos/puppy.jpg HTTP/1.1
Content-Type: image/jpeg
Content-Length: 94328
Host: johnsmith.s3.amazonaws.com
Date: Tue, 27 Mar 2007 21:15:45 +0000
Authorization: AWS AKIAIOSFODNN7EXAMPLE:
MyyxeRY7whkBe+bq8fHCL/2kKUg=
Run Code Online (Sandbox Code Playgroud)
来源:签署和验证 REST 请求。
或者你应该使用aws命令,例如
aws s3 cp s3://rkbtest/check.png ./
Run Code Online (Sandbox Code Playgroud)
在此之前,您需要配置您的AWS 签名版本。
签名版本 4,一种用于在所有 AWS 区域中对 AWS 服务的入站 API 请求进行身份验证的协议。
例如:
aws configure set default.s3.signature_version s3v4
Run Code Online (Sandbox Code Playgroud)
或对于特定配置文件:
aws configure set profile.<profilename>.s3.signature_version s3v4
Run Code Online (Sandbox Code Playgroud)
来源:aws/aws-cli/issues/1006(位于 GitHub)。