Nginx配置SSL证书从申请到部署的完整指南
海外云服务器 40个地区可选 亚太云服务器 香港 日本 韩国
云虚拟主机 个人和企业网站的理想选择 俄罗斯电商外贸虚拟主机 赠送SSL证书
美国云虚拟主机 助力出海企业低成本上云 WAF网站防火墙 为您的业务网站保驾护航
在当今互联网安全日益受到重视的背景下,网站启用 HTTPS 已成为保障数据传输安全的基本要求,作为全球最广泛使用的 Web 服务器之一,Nginx 凭借其高性能、低资源消耗以及出色的可扩展性,被大量应用于各类网站和网络服务中,为了确保用户访问时的数据加密与身份验证,必须为 Nginx 服务器正确配置 SSL/TLS 证书,本文将系统地介绍如何在 Nginx 中部署 SSL 证书,涵盖证书获取、配置文件修改、安全性优化及常见问题排查等内容,帮助开发者与运维人员高效完成 HTTPS 部署。
SSL/TLS 证书的基本概念
SSL(Secure Sockets Layer)是早期用于保障网络通信安全的加密协议,其后续版本 TLS(Transport Layer Security)现已成为行业标准,尽管“SSL”这一术语仍被广泛使用,但实际上大多数现代系统均采用 TLS 协议进行加密传输。
SSL/TLS 证书由受信任的证书颁发机构(CA, Certificate Authority)签发,包含公钥、域名信息、有效期、签发者身份等关键内容,当用户通过浏览器访问一个启用了 HTTPS 的网站时,客户端会验证服务器提供的证书是否合法,并基于该证书建立加密连接,从而防止数据被窃听或篡改。
根据验证级别的不同,SSL 证书主要分为三类:
- DV(Domain Validation):仅验证域名所有权,适合个人博客或小型项目;
- OV(Organization Validation):除域名外还需验证组织真实性,适用于企业官网;
- EV(Extended Validation):最高级别验证,显示绿色地址栏(部分浏览器已取消此功能),多用于金融、电商等高安全需求场景。
对于绝大多数中小型应用而言,使用免费且自动化的 Let’s Encrypt 提供的 DV 证书即可满足基本安全需求。
获取 SSL 证书:以 Let’s Encrypt 为例
目前主流的证书获取方式包括购买商业证书和使用免费 CA 服务。Let’s Encrypt 因其开放性、自动化支持良好和完全免费的特点,成为社区最受欢迎的选择。
Let’s Encrypt 官方推荐使用 Certbot 工具来申请和管理证书,以下是具体操作步骤:
安装 Certbot 及 Nginx 插件
sudo apt update sudo apt install certbot python3-certbot-nginx -y
注:若系统为 CentOS/RHEL,请使用
yum
或dnf
安装对应包。
申请并部署证书
运行以下命令,为指定域名申请证书:
sudo certbot --nginx -d example.com -d www.example.com
Certbot 将自动执行以下操作:
- 检测当前 Nginx 配置;
- 与 Let’s Encrypt 进行 ACME 协议交互,完成域名所有权验证(通常通过 HTTP-01 或 DNS-01 挑战);
- 自动下载并配置证书;
- 更新 Nginx 配置以启用 HTTPS(可选)。
证书文件默认存储于 /etc/letsencrypt/live/example.com/
目录下,主要包括:
fullchain.pem
:完整的证书链(站点证书 + 中间证书);privkey.pem
:私钥文件,需严格保护,不可泄露。
配置 Nginx 启用 SSL
获取证书后,下一步是在 Nginx 中手动或自动配置 SSL 参数,建议先了解原始 HTTP 配置结构,再逐步升级至 HTTPS。
原始 HTTP 配置示例
server { listen 80; server_name example.com www.example.com; root /var/www/html; index index.html; }
改造为 HTTPS 支持的完整配置
listen 80; server_name example.com www.example.com; return 301 https://$host$request_uri; } # 主要 HTTPS 服务配置 server { listen 443 ssl http2; server_name example.com www.example.com; # 证书路径 ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # 启用现代 TLS 版本 ssl_protocols TLSv1.2 TLSv1.3; # 使用强加密套件,优先前向保密算法 ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384; # 关闭服务器端加密套件优先级(可根据实际情况开启) ssl_prefer_server_ciphers off; # 启用会话缓存以提升性能 ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; # 开启 HSTS(谨慎启用,一旦设置难以回退) add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always; # 安全头设置(可选) add_header X-Content-Type-Options nosniff; add_header X-Frame-Options DENY; add_header X-XSS-Protection "1; mode=block"; # 站点根目录与索引页 root /var/www/html; index index.html; # 请求处理逻辑 location / { try_files $uri $uri/ =404; } }
⚠️ 注意事项:
- 若需支持旧版客户端(如 IE8),可保留 TLSv1.1,但不推荐;
http2
需确保 Nginx 编译时启用了--with-http_v2_module
;- HSTS 设置后将在一定时间内强制浏览器使用 HTTPS,请确认无误后再上线。
测试与重启 Nginx 服务
配置完成后,务必先检查语法正确性,避免因错误导致服务中断。
sudo nginx -t
若输出如下信息,则表示配置无误:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
随后重新加载 Nginx 配置:
sudo systemctl reload nginx
此时访问 https://example.com
,浏览器地址栏应显示锁形图标,点击可查看证书详情,表明 HTTPS 已成功启用。
实现证书自动续期
Let’s Encrypt 证书有效期仅为 90 天,因此必须配置自动续期机制,Certbot 自带 renew
命令,结合系统定时任务(cron)可实现无人值守维护。
添加每日自动检测任务
编辑 root 用户的 crontab:
sudo crontab -e
添加以下行,每天中午尝试续期:
0 12 * * * /usr/bin/certbot renew --quiet --post-hook "systemctl reload nginx"
✅ 参数说明:
--quiet
:静默模式,减少日志输出;--post-hook
:续期成功后自动重载 Nginx,确保新证书生效。
Certbot 仅会在证书即将到期(默认30天内)时才实际执行更新操作,不会频繁打扰服务器。
安全加固建议
除了基础的 SSL 配置,还应从多个层面进一步提升站点安全性:
措施 | 说明 |
---|---|
启用 HSTS | 强制浏览器始终使用 HTTPS 访问,防范中间人攻击;建议配合预加载列表提交至 hstspreload.org |
配置 CSP(Content Security Policy) | 防止 XSS 和恶意脚本注入,限制资源加载来源 |
定期更新系统与软件 | 包括 Nginx、操作系统、依赖库,及时修补已知漏洞 |
禁用不安全的协议与加密算法 | 如 SSLv3、TLSv1.0、弱加密套件(RC4、DES)等 |
使用安全扫描工具评估风险 | 推荐使用 SSL Labs 的 SSL Test 对站点进行评分和深度检测 |
还可考虑:
-
使用 Diffie-Hellman 参数增强密钥交换安全性:
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
并在 Nginx 中添加:
sudo certbot --nginx -d example.com -d www.example.com0
-
配置 OCSP Stapling 以加快证书状态验证速度:
sudo certbot --nginx -d example.com -d www.example.com1