【已解决】自建证书实现 HTTPS
本文档详细介绍了在Linux环境下为容器化Web应用配置HTTPS访问的方案。主要内容包括:1)使用OpenSSL生成自签名证书;2)设置证书权限;3)修改Jenkins Pipeline中的Nginx配置以支持HTTPS重定向和SSL加密;4)调整Docker运行参数,添加443端口映射和证书挂载;5)部署验证流程。该方案适用于内网或测试环境,无需购买正式SSL证书,通过简单的配置即可实现安全的
项目背景
本文档基于实际项目经验编写,适用于以下架构:
-
部署方式:容器化部署(Docker/Podman)
-
服务架构:
-
前端容器:
web-app(内置 Nginx) -
后端容器:
web-api
-
-
Nginx 配置:配置文件
nginx.conf存放在 Jenkins Pipeline 中,通过writeFile动态生成 -
部署流程:Jenkins Pipeline 自动构建镜像并部署

本文档适用场景:你只需要在服务器上生成证书,然后修改 Jenkins 中的 Nginx 配置和 Docker 运行参数,即可为前端容器启用 HTTPS。
概述
本文档详细介绍如何在 Linux 环境下使用自签名证书为容器化 Web 应用配置 HTTPS 访问。适用于内网环境或测试环境,无需购买正式 SSL 证书
一、环境准备
1.1 前提条件
-
Linux 服务器(Ubuntu/CentOS/RHEL)
-
Docker 环境已安装
-
Nginx 容器(或宿主机 Nginx)
-
OpenSSL 工具
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/ssl
2.2 生成证书
# 生成自签名证书(有效期365天)
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout server.key \
-out server.crt \
-subj "/CN=192.168.xxx.xxx"
三、设置证书权限
# 证书文件设置为 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 file stage 中,将 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 变量替换服务器 IP |
return 301 https://\$server_name\$request_uri |
HTTP 自动跳转到 HTTPS(注意 \$ 转义) |
ssl_certificate 和 ssl_certificate_key |
证书路径(容器内路径) |
proxy_pass http://${SERVER_IP}:${BACKEND_PORT} |
后端 API 地址 |
4.2 修改 Docker 运行命令
在 Jenkins Pipeline 的 Docker build stage 中,添加 443 端口映射和证书挂载:
stage ('Docker build') {
sh """
CI=false
# 停止并删除旧容器
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测试地址
更多推荐

所有评论(0)