Haproxy (具体的には Haproxy Ingress) を使用して、S3 バケット (DigitalOcean Spaces を使用しています) にリバース プロキシをセットアップしようとしています。
いくつかの試行錯誤の後、プロキシを使用できるようになりましたが、まだうまくいきません。
GET リクエストは正常に機能しますが、「403 - SignatureDoesNotMatch」というエラーが発生するため、PUT リクエスト (putObject など) は機能しません。残念ながら、その理由を見つけることができないようで、広範囲に検索しました。
現時点での私のバックエンドは次のとおりです。
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」を使用してサーバーを無効にしようとしましたが、うまくいきませんでした。
ヘッダーと関係があると思いますが、「Authorization」および「Connection」ヘッダーを追加しようとしましたが、どれも機能していないようです。
バックエンドプロトコル「h2-ssl」も使用しています。これがないとプロキシできなかったからです。
前もって感謝します!
ある程度の進歩があり、署名バージョン v4 は機能しませんが、v2 は機能します。
ただし、私が正しければ、docker レジストリーは v4 を使用しており、最新の標準と互換性があるようにしたいと考えています。
私は S3 についてあまり知りません。現在、認証の違いに関するドキュメントを読んでいますが、どんな助けも大歓迎です!
したがって、さらに調査した後、署名バージョン v4 は要求 URI を使用して署名を計算します。バケット自体が同じ署名を計算すると、別の URI をリッスンするため、リクエスト URI は異なります。
リクエストがnginxによって処理されるときにnginxを使用して署名を再計算している人を見てきましたが、Haproxyでそれを行う方法を見つけていません.
現時点で最善の方法は、署名バージョン v2 を使用することですが、これはほとんどの S3 バケット プロバイダーで廃止される可能性があります。