自签名证书需在宿主机生成并挂载进Nginx容器,配置中指定ssl_certificate和ssl_certificate_key路径,启用listen 443 ssl及TLS安全参数,适合开发测试环境。

直接在容器内启用 HTTPS,关键不是“让容器自己签证书”,而是把自签名证书提前生成好、挂载进容器,并在 Nginx 配置中正确引用。整个过程不依赖外部 CA,适合开发、测试或内网环境。
生成自签名证书(宿主机执行)
证书必须在启动容器前准备好,放在宿主机指定目录(比如 /opt/nginx/ssl),再通过卷挂载给容器使用。
- 创建证书目录:
mkdir -p /opt/nginx/ssl - 进入目录并生成私钥:
openssl genrsa -out nginx.key 2048 - 生成证书请求(注意 CN=your-domain.com 要和你后续访问的域名一致,如
CN=localhost或CN=test.local):openssl req -new -key nginx.key -out nginx.csr -subj "/C=CN/ST=Beijing/L=Beijing/O=Dev/OU=Test/CN=localhost" - 用私钥签发证书:
openssl x509 -req -days 3650 -in nginx.csr -signkey nginx.key -out nginx.crt - 确保权限安全(Nginx 容器需可读):
chmod 644 nginx.crt nginx.key
编写 Nginx HTTPS 配置(server 块启用 443 + SSL)
在宿主机准备一个 nginx.conf 或 conf.d/default.conf,核心是监听 443 并加载证书:
- 必须包含
listen 443 ssl; -
ssl_certificate和ssl_certificate_key的路径要与容器内实际位置一致(例如挂载后是/etc/nginx/ssl/nginx.crt) - 推荐加上基础 TLS 安全配置(避免浏览器报“不安全”):
ssl_protocols TLSv1.2 TLSv1.3;<br>ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
示例片段:
server {
listen 443 ssl;
server_name localhost;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
ssl_protocols TLSv1.2 TLSv1.3;
location / {
root /usr/share/nginx/html;
index index.html;
}
}
启动容器时挂载证书和配置
用 docker run 或 docker-compose.yml 把证书目录和配置文件映射进去。官方镜像默认证书路径是 /etc/nginx/,所以挂载要对齐:
- 挂载证书:
-v /opt/nginx/ssl:/etc/nginx/ssl:ro - 挂载自定义配置(覆盖默认):
-v /opt/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro - 开放 443 端口:
-p 443:443
完整命令示例:
docker run -d \ --name my-nginx \ -p 80:80 -p 443:443 \ -v /opt/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro \ -v /opt/nginx/ssl:/etc/nginx/ssl:ro \ -v /opt/nginx/html:/usr/share/nginx/html:ro \ nginx:alpine
验证 HTTPS 是否生效
启动后不要急着用浏览器打开,先做两步确认:
- 进容器检查文件是否存在:
docker exec -it my-nginx ls /etc/nginx/ssl(应看到nginx.crt和nginx.key) - 检查 Nginx 配置语法:
docker exec my-nginx nginx -t(输出 “test is successful” 才算正常) - 浏览器访问
https://localhost或你设的server_name,首次会提示证书不受信任——这是自签名证书的正常表现,点击“继续访问”即可


















