使用 HTTPS 保护 Nginx:分步指南
在当今的数字环境中,安全至关重要。在您的 Nginx Web 服务器上启用 HTTPS(超文本传输安全协议)不再是可选项;它是保护敏感数据、建立用户信任以及提高网站搜索引擎排名的基本要求。HTTPS 加密用户浏览器与您的服务器之间的通信,防止窃听并确保传输信息的完整性。
本指南将引导您完成使用 SSL/TLS 证书保护 Nginx 服务器、启用 HTTPS 的基本步骤。我们将涵盖获取证书、配置 Nginx 以使用证书,以及执行基本验证以确保一切正常。在本指南结束时,您将拥有一个更安全、更值得信赖的网络存在。
1. 了解 SSL/TLS 证书
在我们深入配置之前,让我们简要了解一下 SSL/TLS 证书是什么。SSL/TLS 证书是一种数字证书,用于验证网站的身份并启用加密连接。当浏览器使用 HTTPS 连接到网站时,它会检查网站的证书以验证其真实性并建立安全的加密通道。
证书有多种类型,但对于大多数网站而言,域名验证 (DV) 证书就足够了。此类证书验证申请人是否控制域名,但不会对域名背后的组织进行广泛检查。
2. 获取 SSL/TLS 证书
有两种主要方法可以为您的 Nginx 服务器获取 SSL/TLS 证书:
- Let's Encrypt(免费且自动化): Let's Encrypt 是一个免费、自动化、开放的证书颁发机构。由于其易用性和成本效益,强烈推荐大多数用户使用。您可以使用 Certbot 等工具自动化获取和续订证书的过程。
- 商业证书颁发机构(付费): 您也可以从 Comodo、DigiCert 或 GoDaddy 等商业 CA 购买证书。这些机构通常提供扩展验证 (EV) 或组织验证 (OV) 证书,这些证书提供更高级别的信任,但会产生费用并涉及更复杂的验证过程。
本指南中,我们将重点介绍使用 Certbot 配合 Let's Encrypt,因为它是最易于访问且应用最广泛的方法。
2.1 安装 Certbot
Certbot 是一个客户端,可自动化获取和续订 Let's Encrypt 证书的过程。安装过程根据您的操作系统和 Nginx 设置略有不同。
对于 Debian/Ubuntu:
sudo apt update
sudo apt install certbot python3-certbot-nginx
对于 CentOS/RHEL/Fedora:
sudo yum install epel-release
sudo yum install certbot python3-certbot-nginx
重要提示: 在继续之前,请确保您的 Nginx 正在运行并通过其域名通过 HTTP 访问。Certbot 需要与您的服务器通信以验证域名所有权。
2.2 使用 Certbot 获取您的证书
安装 Certbot 后,您可以使用它为您的域获取证书。Certbot 可以自动为您配置 Nginx。
导航到您的 Nginx 配置目录。确切路径可能有所不同,但通常是 /etc/nginx/sites-available/。
运行以下命令,将 your_domain.com 和 www.your_domain.com 替换为您的实际域名:
sudo certbot --nginx -d your_domain.com -d www.your_domain.com
然后 Certbot 将:
- 要求提供您的电子邮件地址: 这用于重要的续订通知和安全警报。
- 要求您同意服务条款: 阅读并同意。
- 询问您是否希望与 EFF 共享您的电子邮件: 可选。
- 检测您现有的 Nginx 虚拟主机: 它将列出找到的域。
- 询问您希望如何处理 HTTPS: 您通常会有两个选项:
- 1:不重定向 - 同时提供 HTTP 和 HTTPS,但不将 HTTP 流量重定向到 HTTPS。
- 2:重定向 - 自动将所有 HTTP 流量重定向到 HTTPS。这是大多数用户推荐的选项。
选择选项 2 以获得更安全的设置。
如果成功,Certbot 将通知您证书已安装并设置自动续订。
3. 验证您的 Nginx 配置
Certbot 运行后,它会自动修改您的 Nginx 配置文件以使用新的 SSL/TLS 证书,如果您选择了重定向选项,它也会进行设置。
3.1 检查 Nginx 配置文件
您可以检查您网站的 Nginx 配置文件(例如 /etc/nginx/sites-available/your_domain.com)以查看更改。您应该会找到以下指令:
server {
listen 80;
server_name your_domain.com www.your_domain.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name your_domain.com www.your_domain.com;
ssl_certificate /etc/letsencrypt/live/your_domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your_domain.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
# ... other configurations for your site ...
}
- 第一个
server块监听端口 80 (HTTP) 并将所有请求重定向到 HTTPS。 - 第二个
server块监听端口 443 (SSL/TLS) 并指定您的证书 (ssl_certificate) 和私钥 (ssl_certificate_key) 的路径。 include /etc/letsencrypt/options-ssl-nginx.conf;包含 Nginx 的推荐 SSL 参数。ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;用于 Diffie-Hellman 参数交换,增强安全性。
3.2 测试 Nginx 配置
在重新加载 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
3.3 重新加载 Nginx
配置测试通过后,重新加载 Nginx 以应用更改:
sudo systemctl reload nginx
3.4 在浏览器中验证 HTTPS
打开您的 Web 浏览器并使用 https://your_domain.com 导航到您的域。您应该会在地址栏中看到一个挂锁图标,表示安全连接。点击挂锁通常会提供有关证书的详细信息。
4. 自动续订
Let's Encrypt 证书的有效期为 90 天。Certbot 会自动配置一个系统服务(通常是 cron 任务或 systemd 计时器)以在证书过期前续订它们。您可以通过运行以下命令来测试续订过程,而无需实际续订证书:
sudo certbot renew --dry-run
此命令模拟续订过程,并会提醒您任何潜在问题。
5. 高级 SSL/TLS 配置(可选)
虽然 Certbot 处理了大部分基本配置,但您可能希望微调 SSL/TLS 设置以增强安全性或性能。
5.1 SSL 协议版本
最佳实践是禁用较旧、不安全的 SSL/TLS 协议版本,例如 SSLv2 和 SSLv3,以及 TLSv1.0 和 TLSv1.1。现代浏览器和服务器支持 TLSv1.2 和 TLSv1.3。
在您的 server 块中(在 443 ssl 配置内)添加或修改 ssl_protocols 指令:
ssl_protocols TLSv1.2 TLSv1.3;
5.2 密码套件
密码套件决定了用于 SSL/TLS 连接的加密算法。您可以指定首选密码套件以确保强大的加密。
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 off;
提示: 您可以使用 Mozilla SSL Configuration Generator 等在线工具生成针对您的服务器功能量身定制的推荐 SSL 设置。
5.3 HSTS(HTTP 严格传输安全)
HSTS 是一项安全功能,它强制浏览器仅通过 HTTPS 与您的网站进行交互。一旦浏览器访问了启用 HSTS 的网站,即使您用户键入 http:// 或点击 http:// 链接,它也会自动在所有未来的访问中使用 HTTPS。
要启用 HSTS,请将以下内容添加到监听端口 443 的 server 块中:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
max-age=31536000:设置浏览器记住仅使用 HTTPS 的持续时间(31,536,000 秒 = 1 年)。includeSubDomains:将 HSTS 策略应用于所有子域。
警告: 启用 HSTS 需谨慎。一旦设置,很难恢复。在测试期间,请从较短的 max-age 值(例如 1 小时)开始。在设置较长的 max-age 之前,请确保您的 HTTPS 运行完美。
6. 常见问题排查
- Certbot 无法验证域:
- 确保您的域的 DNS 记录正确指向您的服务器 IP 地址。
- 验证 Nginx 是否正在运行并可通过端口 80 上的 HTTP 访问。
- 检查防火墙规则以确保端口 80 已开放。
- Nginx 重新加载失败:
- 运行
sudo nginx -t以识别配置文件中的语法错误。 - 检查 Nginx 错误日志(
/var/log/nginx/error.log)。
- 运行
- 网站无法通过 HTTPS 访问:
- 确保防火墙中已打开端口 443。
- 验证
listen 443 ssl;指令是否存在且正确。 - 检查
ssl_certificate和ssl_certificate_key的路径是否准确。
总结
使用 HTTPS 保护您的 Nginx 服务器是建立值得信赖和安全在线存在的关键一步。通过遵循本指南,您已经了解了如何获取和配置 SSL/TLS 证书、自动化续订以及实施基本的安全增强功能。定期审查您的 SSL/TLS 配置并保持服务器软件更新是维护强大安全性的基本实践。
实施 HTTPS 是现代 Web 服务器管理的重要一步。它不仅可以保护用户数据,还可以积极影响网站的声誉和搜索引擎可见性。继续探索高级 Nginx 配置和安全最佳实践,以进一步提高服务器的性能和弹性。