MinIO 签名不通过
不管是 MinIO Client 还是 SDK,报错:The request signature we calculated does not match the signature you provided. Check your key and signing method.
按以下情况依次排查问题:
- MinIO 容器内部时间、MinIO Client 容器内部时间、宿主机时间是否同步
- MinIO 内的证书、Nginx 证书、Frp 证书是否一致
- 查看 Nginx 日志,检查请求的 ip 是否为真实 ip
时间不同步问题
创建容器时加入配置来同步宿主机时间:
-e TZ=Asia/Shanghai \
-v /etc/localtime:/etc/localtime:ro \
-v /etc/timezone:/etc/timezone:ro \
不同容器内可能显示的时区不同,例如宿主机显示 CST 时区上午8点,而容器内显示 GMT 时区上午0点,那么这两个时间是相同的。部分机器可能不是 24 小时制,但只要手动换算后时间同步即可
证书问题
证书不一定要指向同一个路径,也不一定要同一个格式,但是绑定的必须是同一个域名
MinIO 容器内部目录 /root/.minio/certs
中需要 public.crt
和 private.key
,public.crt 可以由 pem 格式改后缀名得到
如果是多个域名,可以在此目录下建子目录来存放,例如如果我有两个域名 oss.cimoc.cn
和 myoss.cimoc.cn
都指向同一个 MinIO 服务,那么 /root/.minio/certs
目录结构应该如下:
-certs
-oss.cimoc.cn
-public.crt
-private.key
-myoss.cimoc.cn
-public.crt
-private.key
Nginx 的 SSL 配置参考:
# 公钥也可以是crt格式
ssl_certificate /path/to/fullchain.pem;
# 私钥也可以是key格式
ssl_certificate_key /path/to/privkey.pem;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
add_header Strict-Transport-Security "max-age=31536000";
error_page 497 https://$host$request_uri;
Frp 的 SSL 配置
frpc.ini:
plugin = https2http
plugin_crt_path = /path/to/public.crt
plugin_key_path = /path/to/private.key
Ip问题
Nginx 的日志默认在 /var/log/nginx/access.log
如果你发现请求 MinIO 的日志 IP 如下是 127.0.0.1,那么就是 IP的问题导致签名无法校验通过
127.0.0.1 - - [09/Nov/2023:09:21:47 +0800] "GET /minio/test-img/ HTTP/1.1" 200 757 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0"
在 Nginx 配置中加上:
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
如果有 Frp,检查 frpc.ini 是否有下面的配置,如果有,删除掉:
plugin_host_header_rewrite = 127.0.0.1
重启服务
如果给 MinIO 添加了 证书,那么需要重启:
docker stop minio
docker start minio
修改了 Nginx 配置,需要重载或重启(二选一):
# 重载配置
nginx -s reload
# 重启
systemctl restart nginx
修改了 frpc.ini,需要重启:
# 系统服务重启
systemctl restart frpc
# 如果没有配置系统服务
# 找到pid
ps -ef |grep frpc
# kill
kill -9 找到的pid
# 进入frp的目录
cd /yourfrp
# 启动frpc
frpc -c frpc.ini