问题描述
我实现了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");
成功了。