s3存储桶的Varnish代理无法使用URL中的参数对REST调用进行签名

问题描述

我实现了Varnish HTTP代理以提供S3存储桶中的内容内容是很大的JS客户端2K +文件。 我找到了这个指南 https://info.varnish-software.com/blog/using-varnish-cache-secured-aws-s3-gateway

通常,它会签署http请求并将其重定向到s3端点

sub vcl_backend_fetch
{
  set bereq.http.Host = "bucket.s3.amazonaws.com";
  set bereq.http.Date = Now;

  set bereq.http.NL = {"
"};

  set bereq.http.Authorization = "AWS YOURVERYLONGACCESSID:" +
    digest.base64_hex(digest.hmac_sha1("somelongvalueforsecret",bereq.method + bereq.http.NL + bereq.http.Content-MD5 + bereq.http.NL +
      bereq.http.Content-Type + bereq.http.NL + bereq.http.Date + bereq.http.NL + 
      "/" + "bucket" + bereq.url
    ));

  unset bereq.http.NL;
}

它可用于检索文件,但是,如果我在url中具有http参数,则我想获取它会失败,并显示错误SignatureDoesNotMatch

解决方法

我的同事Reza的博客文章可以追溯到2016年。很有可能是AWS已经更改了签名算法。

我们已经更新了目前可在AWS S3上运行的 VCL代码,但这是我们企业产品的一部分,并使用了一些企业 VMODs

如果您有兴趣,可以启动我们的official Varnish Enterprise images on AWS中的一个,它不需要您事先购买许可证。有关更多信息,请参见https://docs.varnish-software.com/varnish-cache-plus/vmods/aws/

但是,如果您坚持使用 Varnish Cache 进行此操作,建议您查看S3 API规范,并自行调整签名。

,

我使用的代码已过时。 我需要使用sig4版本的AWS REST API签署请求。 此仓库很有帮助:

https://github.com/xcir/libvmod-awsrest

重要提示:如果url包含特殊符号@和[]等,请小心。在我的情况下,签名失败,因为文件名中包含[和]符号。我已经替换了它们

set bereq.url = regsuball(bereq.url,"\[","%5B");
set bereq.url = regsuball(bereq.url,"\]","%5D");

成功了。