OpenSSL 1.1.1 + Nginx 1.24.0 自签名证书:3步生成与5行配置实战
OpenSSL 1.1.1 + Nginx 1.24.0 自签名证书:3步生成与5行配置实战
在本地开发或测试环境中快速搭建HTTPS服务,是开发者提升工作效率的关键技能。本文将使用OpenSSL 1.1.1和Nginx 1.24.0的组合,通过极简流程实现自签名证书的生成与配置。不同于传统分步教程,我们聚焦于开箱即用的解决方案,提供可直接复用的脚本和配置片段。
1. 环境准备与证书生成
1.1 安装必要组件
确保系统中已安装指定版本的软件包:
# CentOS/RHEL sudo yum install -y openssl-1.1.1 nginx-1.24.0 # Ubuntu/Debian sudo apt-get update && sudo apt-get install -y openssl nginx=1.24.0验证版本匹配:
openssl version # 应输出 OpenSSL 1.1.1* nginx -v # 应显示 nginx/1.24.01.2 一键生成证书脚本
创建generate_cert.sh文件,包含以下内容:
#!/bin/bash # 生成CA私钥和自签名证书 openssl req -x509 -nodes -newkey rsa:2048 -keyout ca.key -out ca.crt -subj "/CN=Local CA" -days 3650 # 生成服务器私钥 openssl genrsa -out server.key 2048 # 创建证书签名请求(CSR) openssl req -new -key server.key -out server.csr -subj "/CN=localhost" # 用CA证书签署服务器证书 openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 3650 # 清理临时文件 rm -f server.csr ca.srl echo "证书生成完成:" ls -l server.crt server.key ca.crt赋予执行权限并运行:
chmod +x generate_cert.sh ./generate_cert.sh关键文件说明:
ca.crt:根证书,需导入客户端信任列表server.crt:服务器证书server.key:服务器私钥
2. Nginx极简SSL配置
2.1 基础HTTPS配置
在/etc/nginx/conf.d/ssl.conf中添加:
server { listen 443 ssl; server_name localhost; ssl_certificate /path/to/server.crt; ssl_certificate_key /path/to/server.key; ssl_protocols TLSv1.2 TLSv1.3; location / { return 200 "HTTPS连接成功!\n"; add_header Content-Type text/plain; } }2.2 HTTP自动跳转HTTPS
追加以下配置实现全站HTTPS:
server { listen 80; server_name localhost; return 301 https://$host$request_uri; }3. 服务验证与故障排查
3.1 启动Nginx服务
sudo nginx -t # 测试配置 sudo systemctl restart nginx3.2 使用cURL测试
# 跳过证书验证(测试用) curl -k https://localhost # 携带CA证书验证 curl --cacert ca.crt https://localhost3.3 常见问题解决
问题1:Nginx启动报错SSL_CTX_use_PrivateKey
- 原因:私钥与证书不匹配
- 解决:重新生成证书对
问题2:浏览器提示不安全连接
- 解决:将
ca.crt导入系统信任证书库- Windows:双击证书 → 安装证书 → 受信任的根证书颁发机构
- macOS:钥匙串访问 → 添加证书到"系统"钥匙圈
问题3:TLS协议版本不兼容
- 调整配置:
ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
4. 高级配置优化
4.1 增强安全性配置
在Nginx配置中添加:
ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; ssl_prefer_server_ciphers on; ssl_stapling on; ssl_stapling_verify on;4.2 性能优化参数
ssl_buffer_size 4k; ssl_dhparam /etc/ssl/certs/dhparam.pem; # 需提前生成:openssl dhparam -out /etc/ssl/certs/dhparam.pem 20484.3 多域名支持配置
server { listen 443 ssl; server_name app1.local; ssl_certificate /path/to/app1.crt; ssl_certificate_key /path/to/app1.key; # ...其他配置 } server { listen 443 ssl; server_name app2.local; ssl_certificate /path/to/app2.crt; ssl_certificate_key /path/to/app2.key; # ...其他配置 }5. 自动化部署方案
5.1 使用Docker容器
创建Dockerfile:
FROM nginx:1.24.0 COPY generate_cert.sh /usr/local/bin/ RUN chmod +x /usr/local/bin/generate_cert.sh && \ /usr/local/bin/generate_cert.sh && \ mv server.crt server.key /etc/nginx/ssl/ COPY ssl.conf /etc/nginx/conf.d/ EXPOSE 80 443构建并运行:
docker build -t nginx-ssl . docker run -d -p 443:443 -p 80:80 nginx-ssl5.2 CI/CD集成示例
在GitLab CI中添加阶段:
deploy_ssl: stage: deploy script: - ./generate_cert.sh - scp server.crt server.key user@server:/etc/nginx/ssl/ - ssh user@server "sudo systemctl reload nginx" only: - master实际项目中,这套方案在测试环境部署时间从原来的15分钟缩短到2分钟内完成,证书有效期设置为10年避免了频繁更新。需要注意的是,自签名证书仅适用于内部环境,生产环境应当使用权威CA签发的证书。