SSL 在 Nginx 环境下的完整配置模板及详细部署指南

一、Nginx 配置模板

以下是一个完整的 Nginx 配置示例,包含 SSL 证书配置、HSTS 策略和 OCSP Stapling 优化:

ini 复制代码
nginx
server {
    listen 443 ssl http2;
    server_name www.yourdomain.com;  # 替换为你的实际域名

    # SSL 证书配置
    ssl_certificate /path/to/yourdomain.com.pem;  # 证书文件路径(含公钥)
    ssl_certificate_key /path/to/yourdomain.com.key;  # 私钥文件路径
    ssl_trusted_certificate /path/to/yourdomain.com.chain.pem;  # 证书链文件(如有)

    # SSL 协议优化
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
    ssl_prefer_server_ciphers on;

    # HSTS 策略
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;

    # OCSP Stapling 配置
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8 8.8.4.4 valid=300s;  # 指定 DNS 解析服务器
    resolver_timeout 5s;

    # 其他常规配置
    root /var/www/html;
    index index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }
}

# HTTP 重定向到 HTTPS
server {
    listen 80;
    server_name www.yourdomain.com;
    return 301 https://$host$request_uri;
}

二、详细部署步骤

1. 获取 JoySSL 证书

  1. 注册 JoySSL 账号 :访问 [JoySSL 官网] 完成注册(注册时填写推荐码 230959 可获取免费额度)。

  2. 选择证书类型

    • 单域名证书:适用于单个域名(如 www.yourdomain.com
    • 通配符证书:适用于主域名及所有子域名(如 *.yourdomain.com
  3. 完成域名验证

    • DNS 验证:在域名 DNS 解析中添加一条 TXT 记录
    • 文件验证:下载验证文件并上传至网站根目录
  4. 下载证书文件:验证通过后,下载包含以下文件的压缩包:

    • yourdomain.com.pem(证书文件)
    • yourdomain.com.key(私钥文件)
    • yourdomain.com.chain.pem(证书链文件,部分证书可能不包含)

2. 上传证书到服务器

ruby 复制代码
bash
# 创建 SSL 证书目录(建议放在 /etc/nginx/ssl/ 下)
sudo mkdir -p /etc/nginx/ssl/

# 上传证书文件到服务器
# 可通过 scp、sftp 或云存储等方式上传
# 示例:使用 scp 从本地上传
scp ~/Downloads/yourdomain.com.* username@your_server_ip:/etc/nginx/ssl/

# 设置正确的文件权限
sudo chmod 600 /etc/nginx/ssl/*.key
sudo chmod 644 /etc/nginx/ssl/*.pem

3. 配置 Nginx

  1. 编辑 Nginx 配置文件
arduino 复制代码
bash
   sudo nano /etc/nginx/sites-available/yourdomain.com
   
  1. 粘贴上述配置模板,并修改以下参数:

    • server_name:替换为你的实际域名
    • 文件路径:修改为你的证书文件实际路径
  2. 创建符号链接(如果使用 sites-enabled 目录)

bash 复制代码
bash
   sudo ln -s /etc/nginx/sites-available/yourdomain.com /etc/nginx/sites-enabled/
   

4. 测试并重启 Nginx

bash 复制代码
bash
# 测试配置语法
sudo nginx -t

# 重启 Nginx 使配置生效
sudo systemctl restart nginx

# 检查服务状态
sudo systemctl status nginx

5. 验证部署结果

  1. 浏览器检查

    • 访问 https://yourdomain.com,确认浏览器地址栏显示安全锁图标
    • 点击锁图标查看证书信息,确认颁发者为 JoySSL
  2. 在线测试工具

三、高级优化配置

1. 启用 Session 复用

ini 复制代码
nginx
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;

2. 配置 TLS 1.3 专用参数(Nginx 1.13.0+)

ini 复制代码
nginx
ssl_conf_command Options ServerPreference;
ssl_conf_command Signatures rsa_pss_rsae_sha256 rsa_pss_rsae_sha384 rsa_pss_rsae_sha512;

3. 配置 0-RTT(需要 TLS 1.3 支持)

csharp 复制代码
nginx
ssl_early_data on;  # 需客户端支持,可能存在重放攻击风险,谨慎使用

四、常见问题解决

1. 证书验证失败

  • 问题原因:DNS 记录未生效或文件验证路径错误

  • 解决方案

    • DNS 验证:等待 DNS 记录全球同步(通常需要 5-30 分钟)
    • 文件验证:确认验证文件已上传至网站根目录且可通过 http://yourdomain.com/.well-known/pki-validation/file.txt 访问

2. Nginx 启动失败

  • 问题原因:配置文件语法错误或证书路径错误
  • 解决方案
bash 复制代码
bash
  # 检查具体错误信息
  sudo nginx -t
  # 根据错误提示修正配置
  

3. 浏览器显示"不安全"

  • 问题原因:混合内容(HTTP/HTTPS 混用)或证书链不完整

  • 解决方案

    • 检查页面所有资源是否使用 HTTPS 加载
    • 确保证书链文件(.chain.pem)已正确配置

五、自动续期配置(可选)

1. 使用 Certbot 自动续期(适用于 DNS 验证)

perl 复制代码
bash
# 安装 Certbot
sudo apt install certbot python3-certbot-nginx

# 配置自动续期(需提前配置 DNS API 凭证)
sudo certbot renew --dry-run
# 实际续期命令
sudo certbot renew --quiet --no-self-upgrade

2. JoySSL 官方自动续期工具

  1. 登录 JoySSL 控制台
  2. 进入证书管理页面
  3. 启用"自动续期"功能(需配置服务器 SSH 访问权限)

六、安全建议

  1. 定期更新 Nginx:保持最新版本以修复安全漏洞
  2. 监控证书有效期:设置提前 30 天续期提醒
  3. 启用防火墙:仅开放 443(HTTPS)和 80(HTTP 重定向)端口
  4. 定期审计 :使用工具如 lynx -dump https://yourdomain.com 检查混合内容

通过以上配置,你的网站将获得:

  • A+ 级 SSL 安全评级
  • 完整的 HSTS 策略保护
  • 优化的 TLS 握手性能
  • 自动化的证书续期能力
相关推荐
未定义.22111 小时前
第2篇:请求实战!覆盖GET/POST/请求头/参数全场景
java·python·http·servlet·自动化·jenkins
00后程序员张20 小时前
iOS 应用代码混淆,对已编译 IPA 进行类与方法混淆
android·ios·小程序·https·uni-app·iphone·webview
闻哥1 天前
GET和POST请求的本质区别
java·网络·jvm·spring·http·面试·https
NEXT061 天前
HTTP常考状态码详解(附面试官考察点深扒)
前端·http·面试
码云数智-大飞2 天前
实时通信选型指南:WebSocket 与 HTTP 长轮询深度对比及适用场景分析
websocket·网络协议·http
My_Java_Life2 天前
HTTPS的验证过程
网络协议·http·https
2501_915918412 天前
mobileprovision 描述文件内容查看,查看 Bundle ID、证书指纹等来定位安装与签名问题
android·ios·小程序·https·uni-app·iphone·webview
匠心网络科技2 天前
计算机找工作必看:面试被问HTTP请求头?(二)
前端·学习·http·面试·性能优化·dubbo