美文网首页
Amazon S3 V4签名校验错误

Amazon S3 V4签名校验错误

作者: 猫尾草 | 来源:发表于2020-04-13 10:59 被阅读0次

1. 问题

  部署的ceph对象存储使用了兼容Amazon s3的RGW网关,通过Amazon S3访问对象存储。为了网关的高可用和负载均衡,在RWG网关前面加了一层nginx代理转发。
  发现加了nginx之后V4签名会报错The request signature we calculated does not match the signature you provided. Check your key and signing method.,但是V2签名不会报错。
  经过打开工程debug日志、nginx日志、RGW网关日志,最后发现是RGW网关接受到的请求和客户端发出去的请求的头参数Host不一样。

2. 原因

  在nginx中转发http请求有个参数设置proxy_set_header Host xxx;,当我们使用以下形式的nginx转发时:

upstream backend {
    server 127.0.0.1:8080;
}

server {
    listen 80;
    location / {
      proxy_pass http://127.0.0.1:9000;
    }
}

server {
    listen 80;
    location / {
      proxy_pass backend;
    }
}

  nginx默认使用的是基于IP的转发,这样服务端接收到的请求头参数Host就变成了127.0.0.1:8080127.0.0.1:9000

3. 解决办法

  1. proxy_set_header Host xxx;
      xxx就是你需要的host,保持与客户端发出的请求一致。
      这样做有个问题,你并不知道客户端用的是域名访问还是ip:port访问。
  2. proxy_set_header Host $host;
      客户端请求头包含Host参数时为Host字段的值(不含端口),在请求头未携带Host时为虚拟主机的主域名。
      但是用$host是不含有端口信息,无论客户端请求头Host中是否含有端口。
  3. proxy_set_header Host $http_host;
      把客户端请求头转发到服务端;如果客户端请求头中没有携带这个头部,那么传递到服务端的请求也不含这个头参数。
      比较特殊的是如果使用的是80端口,这里也不会出现80端口。

  以上客户端指的是nginx前一级,服务端指的是nginx后一级,如果有多级代理,都需要设置;也可以不是nginx,是例如Haproxy等等。

相关文章

网友评论

      本文标题:Amazon S3 V4签名校验错误

      本文链接:https://www.haomeiwen.com/subject/jvrzmhtx.html