docker中使用SSL证书实现前后端Https
前后端全链路 HTTPS 的完整配置方案,涵盖 Nginx 前端 HTTPS 托管、webgateway 网关 HTTPS、内部服务安全通信,基于 Docker Compose 实现,包含证书生成、配置文件、验证步骤,可直接参考部署。
一、整体架构说明
前端:Vue/React 静态文件由 Nginx 托管,Nginx 处理 HTTPS(443 端口),对外提供前端访问和 API 反向代理。
网关(webgateway):.NET Core 服务,启用 HTTPS(容器内 443 端口),接收 Nginx 代理的 API 请求,转发到内部服务。
证书:使用自签证书(测试用),生产环境需替换为 CA 颁发证书;Nginx 用crt/key格式,webgateway 用pfx格式,共用证书目录。
二、证书创建
# 1. 创建证书目录
mkdir -p ./web/nginx/ssl# 2. 生成Nginx用的 crt/key 证书(有效期365天)
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout cert.key -out cert.crt -subj "/C=CN/ST=Beijing/L=Beijing/O=Test/OU=IT/CN=192.168.1.185"# 3. 转换为webgateway用的 pfx 证书(密码123456,需与配置一致)
openssl pkcs12 -export -out webgateway.pfx -inkey cert.key -in cert.crt -password pass:123456
二、前端部署https

1、新建web文件夹,在文件夹下新建dist、nginx文件夹;
发布的前端代码放入dist目录;
2、nginx文件夹下新建conf.d文件夹与ssl文件夹
conf.d文件夹下新建default.conf文件挂载Nginx配置;ssl文件存放证书相关
# 443 端口:处理 HTTPS 业务请求(前端+API)
server {listen 443 ssl;server_name 172.16.34.40;  # 宿主机IP或域名(生产环境填真实域名)# SSL 证书配置(已生成的 cert.crt 和 cert.key)ssl_certificate     /etc/nginx/ssl/cert.crt;ssl_certificate_key /etc/nginx/ssl/cert.key;# SSL 安全优化(保持不变)ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5;ssl_prefer_server_ciphers on;# API 代理(后端接口)location /api/ {proxy_pass https://webgateway:443/;proxy_set_header Host $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;  # 告诉后端是 HTTPS 请求}# 前端静态文件location / {root /usr/share/nginx/html;index index.html;try_files $uri $uri/ /index.html;  # 解决前端路由 404}
}3、web文件夹下新建Dockerfile文件、内容如下:
# 基于官方 Nginx 镜像
FROM nginx:1.25# 将本地静态文件(如 Vue 打包后的 dist 目录)复制到 Nginx 默认站点目录
COPY ./dist /usr/share/nginx/html# 将自定义 Nginx 配置文件覆盖容器默认配置
COPY ./nginx.conf /etc/nginx/conf.d/default.conf三、后端部署https

1、发布的代码放入publish文件夹;
2、congig文件夹中appsettings.json新增节点:
 "Kestrel": {"Endpoints": {//HTTP 端点(保留原 80 端口,兼容旧访问)"Http": {"Url": "http://*:80"  // 容器内 HTTP 端口,和之前一致},//HTTPS 端点"Https": {"Url": "https://*:443",  //容器内HTTPS监听443端口(与Docker Compose一致)"Certificate": {"Path": "/app/ssl/webgateway.pfx",  // 容器内 PFX 证书路径(后续 Docker 会挂载)"Password": "123456"  // 第一步设置的证书密码,必须一致!}}}}program.cs 不能配置Kestrel相关;
(2)Dockerfile文件内容如下:
# 使用官方 ASP.NET Core 运行时镜像
FROM mcr.microsoft.com/dotnet/aspnet:7.0
WORKDIR /app
COPY ./publish .
EXPOSE 443
ENTRYPOINT ["dotnet", "SPC.WebGateway.dll"](3)docker-compose.yml配置文件如下:
version: "3.8"#外部访问网 + 内部服务网)
networks:public-net:  # 外部访问网:只让webgateway加入,对外暴露driver: bridgeinternal-net:  # 内部服务网:所有服务内部通信,不对外暴露driver: bridgeservices: #服务web-nginx:  # 服务名称(自定义)image: nginx:1.25  # 使用官方 Nginx 镜像(指定版本更稳定)container_name: web-nginx  # 容器名称restart: always  # 自动重启策略(异常退出/开机后自动启动)ports:- "443:443"  # 如需 HTTPS,映射 443 端口volumes:# 挂载1:本地静态文件(如 Vue 打包后的 dist 目录)到 Nginx 站点目录- ./web/dist:/usr/share/nginx/html  # :ro 表示只读(安全起见)# 挂载2:自定义 Nginx 配置文件(覆盖默认配置)- ./web/nginx/conf.d:/etc/nginx/conf.d  # 存放 *.conf 配置文件# 挂载3:HTTPS 证书(如需)- ./web/nginx/ssl:/etc/nginx/ssl  # 存放 .crt 和 .key 文件environment:- TZ=Asia/Shanghai  # 时区配置(确保日志时间正确)logging: # 日志设置driver: json-fileoptions:max-size: 10m  # 单个日志文件的大小,到达这个值后会进行日志滚动max-file: '3'    # 日志文件保留的数量networks:- public-net   # 对外的网络- internal-net # 对内的网络webgateway:image: webgateway:1.0container_name: webgateway  #容器名restart: always  #重启docker引擎后该容器也重启build: ./webgateway #构建 文件目录ports:# HTTP 端口映射(宿主机 55001 → 容器 80)#- "55000:80"  # 原有:HTTPS 端口映射(宿主机 55000 → 容器 443,不变)- "55000:443"hostname: webgateway #主机名volumes:- ./webgateway/Logs:/app/Logs- ./webgateway/config/appsettings.json:/app/appsettings.json- ./webgateway/config/ocelot.json:/app/ocelot.json# 新增:挂载 PFX 证书到容器内 /app/ssl 目录(和 appsettings 配置的路径对应)- ./web/nginx/ssl:/app/ssl:ro  # 只读挂载,和 Nginx 共用证书目录environment: #环境变量- ASPNETCORE_URLS=https://+:443- TZ=Asia/Shanghai #时区logging: # 日志设置driver: json-fileoptions:max-size: 10m  # 单个日志文件的大小,到达这个值后会进行日志滚动max-file: '3'    # 日志文件保留的数量networks:- public-net   # 对外的网络- internal-net # 对内的网络4、后端如果需要同时兼容http和https需要删除环境变量配置的443端口整个一行;
