没有 OAI 的 S3 存储桶的 AWS CloudFront 预签名 URL 无法正常工作

AWS CloudFront pre-signed URL for S3 Bucket without OAI not working

我尝试使用 HelloWorld.html 根据

为我的 S3 存储桶手动创建 CloudFront 预签名 URL(无 OAI)

https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/PrivateContent.html .

那是行不通的。以下是我执行的手动步骤:

  1. 登录到 root,并设置 CloudFront 密钥对。下载 Public 和私钥
  2. 然后我将 CloudFront 设置为指向我的 S3 存储桶,并带有预签名选项 URL 但没有 OAI。使用 aws cloudfront get-distribution 检查它是否显示我在步骤 1 中设置的正确密钥对 ID
  3. 我编写并尝试了 3 个存储桶策略:i) 使用整个 CloudFront 基础 URL + 对象 ii) 仅使用 s3 对象名称,iii) 使用整个 S3 URL 的策略用于上述对象(不幸的是,Whosebug 不允许添加存储桶策略说“未正确格式化为代码”。我编写的策略是按照用户指南中的建议进行的,没有空格、输入和制表符)
  4. 然后我命令“openssl req -x509 -new -days 100000 -key -out”将下载的私有 PEM 文件转换为证书文件
  5. 然后我使用“openssl smime -encrypt -aes-256-cbc”命令使用步骤 5 证书文件为步骤 3 策略加密(或创建签名)
  6. 然后我编辑了步骤 5 中的签名,将“/”替换为“_”,将“+”替换为“-”,将“=”替换为“~”,因为 AWS 需要签名 URL
  7. 然后我使用上面编辑的签名手动创建了以下“已签名”URL:https://xxx.cloudfront.net/HelloWorld.html?Key-Pair-Id=<第 1 步的密钥对 ID>&Expires=3600&Signature=<第 6 步的编辑签名>

我一直收到“AccessDenied”错误。

以上步骤有什么错误或遗漏的地方?

我怀疑 CloudFront 的 S3 上缺少 IAM 策略。我尝试了 S3 的 Full Public Access,但仍然出现 AccessDenied 错误。 AWS 用户指南解释了如何使用 OAI 为 CLoudFront 编写 S3 IAM 策略,但没有解释为没有 OAI 的 CloudFront 预签名 URL 编写 S3 IAM 策略。

我的步骤存在问题,包括纪元时间的计算。最终,我通过使用“aws cloudfront sign”cli 命令生成签名 url 并追溯到我有缺陷的步骤来解决问题。