6

我已经尝试了很多事情并且我承认失败(我在这里阅读了很多回复,但到目前为止没有一个对我有帮助)。我正在尝试为 Cloudfont 上保存的文件设置签名 URL。我能够为 S3 创建签名 URL,但我无法为 Cloudfront 提供任何工作。对于云端,我使用 AWS SDK 中的以下内容:

var url = AmazonCloudFrontUrlSigner.GetCannedSignedURL(    AmazonCloudFrontUrlSigner.Protocol.http, "cdn.coffeebreakgrooves.com", privateKey, 
file, cloudFrontKeyPairID, DateTime.Now.AddDays(2));

我生成了一个签名的 URL,但是在访问该链接时访问被拒绝,当我读到它时建议我设置 Origin Access Identity。所以我然后去我的分发设置并设置原始访问身份并选择:

  • 限制存储桶访问:是
  • 源访问身份:使用现有身份
  • 授予读取权限:是,更新存储桶策略

然后所有文件都在 Cloudfront 上公开可用,无论我对 S3 中的 ACL 有什么设置(所以即使 file.txt 对 S3 中的任何人都没有权限,它也可以通过 Cloudfront 访问),我无法判断是否已签名URL 是否有效,因为无论是否使用查询字符串,下载都有效,并且文件已公开可用。本质上,我怎样才能使我的文件私有但可以使用签名的 URL 下载(我的签名方法是否正确?)。如果我删除生成的存储桶策略,访问将再次受到限制。我想我需要知道如何设置存储桶策略,以便原始访问身份只能访问具有签名 URL 的存储桶......也许。

非常感谢您的帮助!

4

1 回答 1

8

经过一段时间的休息和重新思考,这就是我出错的地方。在同一个发行版中不可能有一些内容是安全的,而另一些内容是不安全的。整个分布是否安全。这是我的解决方案。

  1. 在 AWS 中为您的安全项目设置一个新存储桶
  2. 在 Cloudfront 中添加一个新分配,指向在 1 中创建的新存储桶,并为“限制查看者访问”选择“是”,为“转发查询字符串”选择“是”(这只是为了添加向特定下载添加内容处置的功能)和为“受信任的签名者”选择“自我”
  3. 在 AWS 顶部,单击您的姓名并选择“安全凭证”并选择“继续”,因为我们在上面选择了“自我”。
  4. 单击“CloudFront 密钥对”并选择“创建新密钥对”。提供时下载密钥文件(不再提供),您需要私钥。还可以根据需要复制访问密钥 ID。
  5. 转到您的发行版,单击安全发行版旁边的 i,单击源选项卡,单击“创建源”或选择源并选择“编辑”,然后为“限制存储桶访问”选择“是”,创建新身份和“是”更新桶策略。这实质上意味着 Cloudfront 可以针对您的存储桶进行身份验证。
  6. 在您的项目中,转到 NuGet 并搜索“AWS”并安装 AWS 开发工具包。
  7. 将私钥文件 (pk* ** .pem) 复制到网站根目录上方的文件夹(或相对私密的位置)
  8. 按照以下添加一些代码以生成带有 Content Disposition 标头的安全 URL。

我不得不说,如果没有 Torsten 在https://forums.aws.amazon.com/thread.jspa?messageID=421768上的帖子的帮助,我无法解决这个问题,该帖子在 PHP 中,但为我指明了正确的方向:

string cloudFrontKeyPairID = "myaccesskeyidfrompoint4";
string pathtokey = HttpContext.Current.Request.MapPath("~/").Replace("wwwroot", "ssl") + "pk-mykeyidfilenamesavedin4.pem";
FileInfo privateKey = new FileInfo(pathtokey);
string file = "folder/mytrack.mp3?response-content-disposition=" + 
HttpContext.Current.Server.UrlEncode("attachment;filename='a_filename_with_no_spaces.mp3'"); 
//I can't figure out how to do spaces or odd characters.

url =   AmazonCloudFrontUrlSigner.GetCannedSignedURL(
    AmazonCloudFrontUrlSigner.Protocol.http, 
    "customcname.mydomain.com", 
    privateKey, 
    file, 
    cloudFrontKeyPairID, 
    DateTime.Now.AddDays(2));

我希望对某人有所帮助,无论如何我都会将其用作个人资源!在没有设置“限制查看者访问”的现有存储桶上启用原始访问身份实际上会打开存储桶上所有项目的权限。这可能是可取的,也可能不是可取的!如果我有任何问题,请告诉我,这对我来说都是全新的。

于 2013-07-03T21:15:38.950 回答