Nginx 配置 HTTPS 证书

好的,Nginx 配置 HTTPS 证书是实现网站安全访问的基础。下面我将为您提供一个从证书获取到 Nginx 配置的完整、详细的实现指南,涵盖两种主流场景:​使用 Let‘s Encrypt 免费证书使用商业证书

图片[1]_Nginx 配置 HTTPS 证书_知途无界

核心概念

  • SSL/TLS 证书​:一种数字证书,用于在客户端(如浏览器)和服务器之间建立加密链接,并验证服务器的身份。
  • HTTPS​:在 HTTP 协议基础上加入 SSL/TLS 加密层。
  • 证书链​:通常包括服务器证书、中间证书颁发机构(Intermediate CA)证书和根证书。浏览器需要完整的证书链来验证服务器证书的有效性。
  • 私钥​:与证书配对的密钥,必须严格保密,用于解密客户端发送的加密信息。

前提条件

  1. 一台拥有公网 IP 的服务器(如阿里云、腾讯云 ECS)。
  2. 一个已解析到该服务器 IP 的域名(如 example.com)。
  3. 已安装 Nginx。如果未安装,请先安装: # Ubuntu/Debian sudo apt update && sudo apt install nginx -y # CentOS/RHEL sudo yum install epel-release -y sudo yum install nginx -y

方案一:使用 Let’s Encrypt (certbot) 自动配置(推荐用于个人或小型网站)

Let’s Encrypt 提供免费的、自动化的 SSL 证书,有效期为 90 天,但通过 certbot 工具可以轻松实现自动续期。

步骤 1:安装 Certbot

# Ubuntu/Debian
sudo apt install certbot python3-certbot-nginx -y

# CentOS/RHEL (需要先启用 EPEL 和 PowerTools)
sudo yum install epel-release -y
sudo yum config-manager --set-enabled powertools # CentOS 8/RHEL 8
# 或者 sudo dnf config-manager --set-enabled crb # CentOS 9/RHEL 9
sudo yum install certbot python3-certbot-nginx -y

步骤 2:获取证书并自动配置 Nginx

certbot--nginx 插件可以自动修改你的 Nginx 配置文件,添加 SSL 相关设置。

sudo certbot --nginx -d example.com -d www.example.com
  • -d:指定要为其申请证书的域名。你可以一次性添加多个。

执行过程交互:​

  1. 输入邮箱地址(用于紧急续期和安全通知)。
  2. 阅读并同意服务条款。
  3. 选择是否将 HTTP 流量重定向到 HTTPS(Redirect)。​强烈建议选择 ‘2’ 以强制使用 HTTPS

完成后,Certbot 会自动重启 Nginx,你的网站就已经可以通过 HTTPS 访问了。

步骤 3:验证自动续期

证书每 90 天需要续期。Certbot 在安装时会自动创建一个定时任务(cron job 或 systemd timer)来尝试续期。

你可以手动测试续期过程:

sudo certbot renew --dry-run

如果这个命令没有报错,说明自动续期配置成功。


方案二:使用商业证书或手动上传证书

这种方式适用于从其他 CA 机构(如 DigiCert, GeoTrust, TrustAsia 等)购买的证书。

步骤 1:获取证书文件

购买证书后,你会从 CA 那里收到一个或多个文件,通常包括:

  • YourDomain.crt​:你的域名证书文件。
  • YourDomain.key​:你的私钥文件(如果你是自己生成的 CSR,则已有此文件)。
  • intermediate.crt​ 或 ​ca-bundle.crt​:中间证书链文件。

步骤 2:在服务器上组织证书文件

将收到的文件上传到服务器上一个安全的目录,例如 /etc/nginx/ssl/

sudo mkdir -p /etc/nginx/ssl/example.com
# 使用 scp 或其他工具上传 YourDomain.crt, YourDomain.key, intermediate.crt 到该目录

非常重要:​​ 合并证书链。
Nginx 要求一个完整的证书链文件(full chain)。你需要将你的域名证书和中间证书合并成一个文件。

# 进入证书目录
cd /etc/nginx/ssl/example.com

# 合并证书:你的证书在前,中间证书在后
cat YourDomain.crt intermediate.crt > fullchain.pem

# 你的私钥文件应该是 YourDomain.key
# 为了方便,可以创建一个符号链接或直接重命名
ln -s YourDomain.key privkey.pem
# 或者直接重命名
mv YourDomain.key privkey.pem

现在你有两个关键文件:

  • fullchain.pem:包含服务器证书和中间证书链。
  • privkey.pem:包含你的私钥。

设置正确的文件权限(安全关键!):​
私钥必须是只读且仅对所有者(通常是 root 或 nginx 用户)可见。

sudo chmod 600 /etc/nginx/ssl/example.com/privkey.pem
sudo chmod 644 /etc/nginx/ssl/example.com/fullchain.pem
sudo chown -R root:root /etc/nginx/ssl/example.com/

步骤 3:配置 Nginx

编辑你的 Nginx 站点配置文件,通常在 /etc/nginx/sites-available/example.com/etc/nginx/conf.d/example.com.conf

# HTTP 服务器块,用于将 HTTP 请求重定向到 HTTPS
server {
    listen 80;
    server_name example.com www.example.com;
    # 如果你的证书支持,可以让 Let's Encrypt 验证域名的目录,否则注释掉下一行
    # location /.well-known/acme-challenge/ { ... }

    # 强制将所有 HTTP 请求重定向到 HTTPS
    return 301 https://$server_name$request_uri;
}

# HTTPS 服务器块
server {
    listen 443 ssl http2; # 启用 HTTP/2 提升性能
    server_name example.com www.example.com;

    # === SSL 证书配置 ===
    ssl_certificate /etc/nginx/ssl/example.com/fullchain.pem;   # 合并后的证书链路径
    ssl_certificate_key /etc/nginx/ssl/example.com/privkey.pem; # 私钥路径

    # === SSL 协议与加密套件优化 ===
    ssl_protocols TLSv1.2 TLSv1.3; # 只使用安全的协议版本
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305;
    ssl_prefer_server_ciphers off; # 对于 TLSv1.3,建议设置为 off

    # === 安全增强头部 ===
    add_header Strict-Transport-Security "max-age=63072000" always; # 强制浏览器使用 HTTPS
    add_header X-Frame-Options DENY;              # 防止点击劫持
    add_header X-Content-Type-Options nosniff;   # 防止 MIME 类型嗅探攻击

    # === 其他常规配置 ===
    root /var/www/html; # 你的网站根目录
    index index.html index.htm;

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

    # 可以配置 gzip, proxy_pass 等其他设置
}

步骤 4:测试并重载 Nginx

  1. 检查配置文件语法​: sudo nginx -t 如果显示 syntax is oktest is successful,则配置正确。
  2. 重载 Nginx​ 以使配置生效: sudo systemctl reload nginx # 或者 sudo service nginx reload

验证 HTTPS 是否生效

  1. 浏览器访问​:在浏览器中打开 https://example.com,地址栏左侧应显示一个锁形图标。点击它可以查看证书详情,确认证书有效且属于你的域名。
  2. 在线 SSL 检测工具​:使用 SSL Labs 的测试工具,输入你的域名,它会给出详细的评级(如 A+, A)和配置建议。

故障排除

  • Permission denied​:检查证书和私钥文件的权限和所有者是否正确。
  • SSL: error:0200100D:system library:fopen:Permission denied​:Nginx 工作进程(通常是 www-datanginx 用户)无权读取证书文件。确保文件权限为 644,目录权限为 755
  • 证书不匹配​:确保 ssl_certificate 指向的是合并了中间证书的 fullchain.pem 文件,而不仅仅是你的域名证书。
  • 502 Bad Gateway​:如果你在 location 块中使用了 proxy_pass,检查后端服务是否正常运行。

按照以上步骤,你应该能够成功地为你的 Nginx 网站配置 HTTPS。对于大多数用户,​强烈推荐使用方案一(Let’s Encrypt)​,因为它免费、自动化且足够安全。

© 版权声明
THE END
喜欢就点个赞,支持一下吧!
点赞20 分享
评论 抢沙发
头像
欢迎您留下评论!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容