在企业应用中,MinIO 是常用的对象存储服务,默认通过 HTTP 提供 API 接口和管理控制台。为了保证数据安全和传输加密,我们对现有 Docker 部署的 MinIO 服务进行了 HTTPS 改造。本文总结整个过程,包括环境信息、配置步骤和测试验证。

一、可行性分析
把 MinIO 改成 HTTPS 来用,有两种思路:
方案一:直接给 MinIO 配置证书
MinIO 原生支持 HTTPS,只要你在运行目录里放置证书就行。
步骤
-
准备证书
-
如果是公网域名,推荐用 Let's Encrypt 免费证书;
-
如果只是测试,可以用自签名证书(
openssl
就能生成)。
假设你的域名是
minio.example.com
,生成好的证书文件是:-
public.crt
(公钥证书) -
private.key
(私钥)
-
-
放置证书文件
MinIO 要求证书文件在运行目录下的
.minio/certs/
路径:~/.minio/certs/public.crt ~/.minio/certs/private.key
如果用的是 CA 链证书,还需要把
ca.crt
放进去。 -
启动 MinIO
minio server /data --address ":9000"
此时就能通过
https://minio.example.com:9000
访问了。 -
修改配置文件
minio: endpoint: https://minio.example.com:9000 bucket: **你的桶** accessKey: 你的Key secret: 你的secret
方案二:Nginx/Traefik 反向代理成 HTTPS
如果你不想改 MinIO 的配置,可以用 Nginx 或 Traefik 来做代理。
Nginx 示例
server {
listen 443 ssl;
server_name minio.example.com;
ssl_certificate /etc/nginx/ssl/minio.example.com.pem;
ssl_certificate_key /etc/nginx/ssl/minio.example.com.key;
location / {
proxy_pass http://127.0.0.1:9000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
然后修改配置文件:
minio:
endpoint: https://minio.example.com:9000
bucket: **你的桶**
accessKey: 你的Key
secret: 你的secret
-
如果能控制 MinIO 的运行环境,直接用 方案一,简单稳定;
-
如果 MinIO 已经运行在 Docker 或服务里,不想动它,就用 方案二,外面套一层 HTTPS。
二、动手实操:
服务器与部署信息
-
公网 IP :
3**.2**.2*.7*
-
域名 :
***.***.com
-
Docker 镜像版本 :
minio/minio:RELEASE.2024-03-15T01-07-19Z
-
数据目录 :
/home/minio/data
-
配置目录 :
/home/minio/config
-
证书目录 :
/home/minio/config/certs/
(已放置public.crt
和private.key
) -
MinIO 用户 :
h**gz**
-
桶名 :
d*-s**
配置 HTTPS
-
准备证书
-
域名证书:
minio.example.com.pem
-
私钥文件:
minio.example.com.key
-
注意:
public.crt
必须包含完整证书链(域名证书 + 中间证书)。
-
-
放置证书到 MinIO 容器
证书目录通常是这样
~/.minio/certs/ # 证书主目录 ├── public.crt # 服务端证书 ├── private.key # 服务端私钥 ├── CAs/ # 用于存放客户端信任的 CA 根证书
cp /usr/local/nginx/conf/key/minio.example.com.pem /home/minio/config/certs/minio.example.com.crt cp /usr/local/nginx/conf/key/minio.example.com.key /home/minio/config/certs/minio.example.com.key
-
重启 MinIO 容器
docker restart <minio_container_name>
-
更新应用配置
将 MinIO 的 API endpoint 改为 HTTPS:
minio: endpoint: https://minio.example.com:9000 bucket: **你的桶** accessKey: 你的Key secret: 你的secret
验证 HTTPS
证书验证
curl -vk https://minio.example.com:9000
输出示例:
SSL certificate verify ok. Server certificate: subject: CN=*.minio.example.com start date: Aug 7 2024 expire date: Sep 6 2025
✅ 证书有效且可信,TLS 加密连接建立成功。
HTTP 已禁用
curl -vk http://minio.example.com:9000
输出:
400 Bad Request - Client sent an HTTP request to an HTTPS server.
说明 HTTP 已被禁用,所有请求必须走 HTTPS。
鉴权提示
直接访问 /
会返回:
<Error><Code>AccessDenied</Code><Message>Access Denied.</Message></Error>
这是正常现象,因为 MinIO API 需要 AccessKey/SecretKey 才能访问桶和对象。
三、总结收尾
-
安全性提升
- 所有数据传输通过 HTTPS 加密,避免明文泄露。
-
证书管理
-
确保证书有效期及时更新,否则客户端会报过期错误。
-
MinIO 证书目录必须包含完整证书链。
-
-
HTTP 访问禁用
-
默认情况下,MinIO 开启 TLS 后会拒绝 HTTP 请求。
-
如需兼容 HTTP,可通过 Nginx 反向代理实现自动跳转。
-
-
客户端访问
- 使用 MinIO 官方客户端
mc
,配置 AccessKey/SecretKey 进行访问:
- 使用 MinIO 官方客户端
MinIO 系统已经实现 HTTPS 加密访问,为数据安全提供了可靠保障,同时兼容现有应用程序使用。