AWS CloudFront 签名 URL 的访问被拒绝
Posted
技术标签:
【中文标题】AWS CloudFront 签名 URL 的访问被拒绝【英文标题】:Access denied for AWS CloudFront signed URL 【发布时间】:2019-08-30 13:59:36 【问题描述】:我已经设置了以下信息:
-
创建了一个 AWS S3 存储桶并将一些图像上传到特定文件夹中
创建了 AWS CloudFront Web 分配:
源域名:从列表中选择的 S3 存储桶
限制存储桶访问:是
源访问身份:选定的现有身份
授予对存储桶的读取权限:是,更新存储桶政策
AccessDenied
拒绝访问
我已经从上面的过程中得到了签名的 URL,比如
image.png?policy=xxxxx@signature=xxx@Key-Pair-Id=XXXXXXX
但我无法访问网址
云端策略的 JSON 示例
"Statement": [
"Resource": "XXXXXXXXXX.cloudfront.net/standard/f7cecd92-5314-4263-9147-7cca3041e69d.png",
"Condition":
"DateLessThan":
"AWS:EpochTime": 1555021200
,
"IpAddress":
"AWS:SourceIp": "0.0.0.0/0"
,
"DateGreaterThan":
"AWS:EpochTime": 1554848400
]
添加了 CloudFront 存储桶策略
"Version": "2012-10-17",
"Statement": [
"Sid": "",
"Effect": "Allow",
"Principal":
"AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity XXXXXXXXXXXXXXX"
,
"Action": [
"s3:PutObject",
"s3:GetObject"
],
"Resource": "arn:aws:s3:::bucket_name/*"
,
"Sid": "",
"Effect": "Allow",
"Principal":
"AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity XXXXXXXXXXXXXXX"
,
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::bucket_name"
]
【问题讨论】:
您是否检查了私钥文件是否已正确转换以创建签名策略 URL? 请显示完整的错误。 @r123 会检查 该错误看起来可能来自 S3。检查您的 S3 存储桶策略以确保没有任何明确拒绝,应用了 OAI 策略,并可选择在存储桶 arn 上添加listBucket
,例如arn:aws:s3:::bucket_name
。如果您只有一个桶的 getObject 权限并尝试获取不存在的对象,您将得到 403,但如果您有 listBucket 权限,您将得到 404。
@cementblocks In bucket policy 有权访问 ListBucket、GetObject 和 PutObject
【参考方案1】:
看起来您看到的 AccessDenied 错误与您提到的步骤无关,它允许 CloudFront 使用使用 sigv4 的特殊用户访问 S3 的 Origin 访问身份,使用上述步骤,您会看到添加到存储桶策略的允许语句。
如果是来自 S3 的错误,您将看到 2 个请求 ID、主机和请求 ID 以及访问被拒绝消息。
image.png?policy=xxxxx@signature=xxx@Key-Pair-Id=XXXXXXX 如果您看到访问被拒绝,则错误在于 CloudFront 签名 URL(受限查看器访问)。
要查看生成的 CloudFront 签名 URL 有什么问题,请尝试对策略值进行 base64 解码并查看资源 URL/过期等是否正确。
【讨论】:
是的,我尝试解码给定日期/时间未过期且资源 URL 也正确的策略值pan> 嗯,可以分享一个示例解码策略或响应标头吗?我假设您也有正确的 keypair-id(CloudFront 不是通用 AWS 访问密钥) @dwayneJohn 你说资源 URL 是正确的,但如果没有看到示例,我们无法确认这一点。资源必须是浏览器请求的完整 URL,包括方案和确切的主机名。此外,签名的 URL 不应包含@
,如您所示 - 分隔符是 &
。这些细节并非微不足道。
如何存储来自 CloudFront 参数存储的私钥?
您需要在本地下载私钥才能在代码中使用它,顺便说一句,您提到的资源 url 和您正在访问的 url 不匹配还是只是一个示例?由于您使用 CloudFront 访问自定义策略,因此请尝试使用通配符来避免拼写错误。以上是关于AWS CloudFront 签名 URL 的访问被拒绝的主要内容,如果未能解决你的问题,请参考以下文章
Amazon Cloudfront 签名 URL 访问被拒绝问题
通过 AWS 开发工具包创建签名的 S3 和 Cloudfront URL
使用 Java AWS 开发工具包的 Cloudfront 限时(签名)URL