我正在尝试使用 Haproxy(特别是 Haproxy Ingress)为我的 S3 存储桶(我正在使用 DigitalOcean Spaces)设置反向代理。
经过一些试验和错误,我得到了代理的某个地方,但它还不能正常工作。
GET 请求工作正常,但是,PUT 请求(如 putObject)不起作用,因为我收到错误“403 - SignatureDoesNotMatch”。不幸的是,我似乎无法找到原因,并且我已经进行了广泛的搜索。
我现在的后端如下:
backend s3-reverse-proxy_443
mode http
balance roundrobin
acl https-request ssl_fc
http-request redirect scheme https if !https-request
http-request set-header Host <bucket>.ams3.digitaloceanspaces.com
http-request set-header X-Original-Forwarded-For %[hdr(x-forwarded-for)] if { hdr(x-forwarded-for) -m found }
http-request del-header x-forwarded-for
option forwardfor
http-response set-header Strict-Transport-Security "max-age=15768000"
server srv001 5.101.110.225:443 weight 1 proto h2 alpn h2 ssl no-sslv3 no-tlsv10 no-tlsv11 no-tls-tickets verify none check inter 2s
尝试仅使用“.ams3.digitaloceanspaces.com”来推翻服务器,但这没有用。
我认为这与标题有关,但我尝试添加“授权”和“连接”标题,但它们似乎都不起作用。
我也在使用后端协议“h2-ssl”,因为没有它,它就不能代理。
提前致谢!
取得了一些进展,签名版 v4 不起作用,但 v2 可以。
但是,如果我是正确的,docker 注册表使用 v4,我希望它与最新标准兼容。
我对 S3 了解不多,我目前正在阅读有关身份验证差异的文档,但欢迎提供任何帮助!
所以,经过一番调查,签名版本 v4 使用请求 URI 来计算签名。当存储桶本身计算相同的签名时,请求 URI 是不同的,因为它侦听另一个 URI。
我见过一些人在 nginx 处理请求时使用 nginx 重新计算签名,但还没有找到在 Haproxy 中执行此操作的方法。
现在最好的方法是使用签名版本 v2,但是,对于大多数 S3 存储桶提供商来说,它可能已被弃用。