Minio临时地址访问资源提示SignatureDoesNotMatch问题记录
- 问题描述:公司的测试环境使用MInio做对象存储,某天在做个人中心下载功能时发现附件下载请求出现403错误,响应返回的是签名不匹配SignatureDoesNotMatch。
- 问题排查
- 首先能够正常的通过Minio获取到临时访问路径,那么就可以排除endpoint、accessKey、secretKey和bucketName这些基础的配置问题
- 问题描述已经明确了是签名不匹配那么可以列举出有哪些情况下会导致签名不匹配
- 后端获取到的签名URL是否被转码操作,或者可以比对一下后端获取到的地址和前端访问的地址是否有差异
- Minio的签名依赖时间戳,可以看下访问的服务器和Minio所在的服务器是否时间一致
- Nginx在做反向代理时Host是否正确
一般情况下2、3情况是最容易出现的。
- 首先从最简单的路径一致性问题排查,这个可以直接通过日志的方式,也是很少会出问题。(这里不是这个原因)
- 检查时间是否一致,服务器命令:通过 date 命令,或者 timedatectl status 查看服务器时间是否一致
这里由于之前未做NTP的同步所以,NTP enabled 为 n/a NTP synchronized为 no,虽然通过date 可以看到时间是正常的,但是也可能存在这样的问题,所以我们这里就直接先使用NTP做下同步,这样也可以避免在之后Minio的时间偏移量大了之后某一天突然出现签名不匹配问题。
- 安装 chrony Linux 系统上进行 NTP 时间同步最常用的工具(更轻量、启动更快、在不稳定的网络下表现更好)
sudo apt update
sudo apt install chrony
# 启动服务
sudo systemctl start chronyd
# 设置为开机自启
sudo systemctl enable chronyd
# 检查状态
sudo systemctl status chronyd
2. 查看系统偏移量 chronyc tracking 其中System time 这个在正负0.00…的情况下也就是偏移量极小就可以去重启Minio服务,然后再次验证(确认也不是时间的问题)
- 排查Nginx的反向代理Host的问题
继续查阅资料,发现minio做签名时除了时间参数之外,还和Host有关,也就是获取临时地址用于计算的签名使用的Host和验证签名使用的Host必须要一致。从代码中可以看到,获取了最初的临时地址后,由于使用的是IP+端口的形式,在代码中做了转换返回给前端的是域名的形式,然后在代理的过程中配置的是:
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme
$host为域名 $scheme 为https 和获取临时地址时的不一致,那么只有在代理的地方去做修改
proxy_set_header 直接写后端一开始通过minio获取到的地址时的ip和端口
proxy_set_header X-Forwarded-Proto 因为后端访问minio直接用的 Http 所以这里也要一致
最后问题解决,确实是ng的问题(吐槽一下:问了都说没改什么)。