【已解决】自建证书实现 HTTPS

张开发
2026/4/13 21:45:45 15 分钟阅读

分享文章

【已解决】自建证书实现 HTTPS
项目背景本文档基于实际项目经验编写适用于以下架构部署方式容器化部署Docker/Podman服务架构前端容器web-app内置 Nginx后端容器web-apiNginx 配置配置文件nginx.conf存放在 Jenkins Pipeline 中通过writeFile动态生成部署流程Jenkins Pipeline 自动构建镜像并部署本文档适用场景你只需要在服务器上生成证书然后修改 Jenkins 中的 Nginx 配置和 Docker 运行参数即可为前端容器启用 HTTPS。概述本文档详细介绍如何在 Linux 环境下使用自签名证书为容器化 Web 应用配置 HTTPS 访问。适用于内网环境或测试环境无需购买正式 SSL 证书一、环境准备1.1 前提条件Linux 服务器Ubuntu/CentOS/RHELDocker 环境已安装Nginx 容器或宿主机 NginxOpenSSL 工具1.2 检查 OpenSSL这里是在宿主机即部署前端容器所在的Linux服务器# 检查 OpenSSL 是否已安装 openssl version # 如果未安装执行以下命令安装 # Ubuntu/Debian sudo apt install openssl -y # CentOS/RHEL sudo yum install openssl -y二、生成自签名证书2.1 创建证书目录# 创建证书存储目录 mkdir -p ~/nginx-ssl/ssl cd ~/nginx-ssl/ssl2.2 生成证书# 生成自签名证书有效期365天 openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout server.key \ -out server.crt \ -subj /CN192.168.102.117三、设置证书权限# 证书文件设置为 644 权限所有人可读 chmod 644 server.crt # 私钥文件设置为 600 权限仅所有者可读写 chmod 600 server.key # 验证权限 ls -la预期输出-rw-r--r-- 1 user user 1234 Mar 31 10:00 server.crt -rw------- 1 user user 1675 Mar 31 10:00 server.key四、修改 Jenkins Pipeline 配置4.1 修改 Nginx 配置文件在 Jenkins Pipeline 的Prepare nginx config filestage 中将 Nginx 配置修改为支持 HTTPS 的版本stage (Prepare nginx config file) { script { // 定义变量请修改为你的实际值 def SERVER_IP ${SERVER_IP} // 服务器 IP def BACKEND_PORT ${BACKEND_PORT} // 后端 API 端口 sh rm -rf ${NGINX_CONFIG} writeFile file: ${NGINX_CONFIG}, text: # HTTP server - redirect to HTTPS server { listen 80; listen [::]:80; server_name ${SERVER_IP}; return 301 https://\$server_name\$request_uri; } # HTTPS server server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name ${SERVER_IP}; # SSL certificate ssl_certificate /etc/nginx/ssl/server.crt; ssl_certificate_key /etc/nginx/ssl/server.key; # SSL configuration ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; # Frontend static files directory root /usr/share/nginx/html; index index.html; # Logs access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; # API proxy for backend location /api { client_max_body_size 0; proxy_pass http://${SERVER_IP}:${BACKEND_PORT}; 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; } # Frontend routing (SPA support) location / { try_files \$uri \$uri/ /index.html; } } } }参考关键配置说明配置说明server_name ${SERVER_IP}使用 Jenkins 变量替换服务器 IPreturn 301 https://\$server_name\$request_uriHTTP 自动跳转到 HTTPS注意\$转义ssl_certificate和ssl_certificate_key证书路径容器内路径proxy_pass http://${SERVER_IP}:${BACKEND_PORT}后端 API 地址4.2 修改 Docker 运行命令在 Jenkins Pipeline 的Docker buildstage 中添加 443 端口映射和证书挂载stage (Docker build) { sh CIfalse # 停止并删除旧容器 docker stop ${FRONTEND_CONTAINER} || true docker container rm ${FRONTEND_CONTAINER} || true # 构建新镜像 docker build -t ${PROJECT_NAME} . # 运行容器添加 HTTPS 支持 docker run -d \\ --name ${FRONTEND_CONTAINER} \\ -p ${HTTP_PORT}:80 \\ -p 443:443 \\ -v ${CERT_DIR}:/etc/nginx/ssl:ro \\ ${PROJECT_NAME} }参考关键参数说明参数说明-p ${HTTP_PORT}:80映射 HTTP 端口保持原有访问方式-p 443:443映射 HTTPS 端口新增-v ${CERT_DIR}:/etc/nginx/ssl:ro挂载证书目录只读五、部署与验证5.1 执行 Jenkins Pipeline提交代码到 Git 仓库在 Jenkins 中触发构建观察构建日志确认无错误5.2 验证容器状态# 查看容器运行状态 docker ps | grep ${FRONTEND_CONTAINER}5.3 测试 HTTPS 访问在浏览器访问你的测试地址可进入https但会显示不安全六、客户端安装证书将证书下载到本地并导入到浏览器安装即可得到一个安全的HTTPS测试地址

更多文章