使用 HTTPS 保护 Nginx:分步指南

在本综合分步指南中,了解如何使用 HTTPS 保护您的 Nginx Web 服务器。我们涵盖了使用 Certbot 从 Let's Encrypt 获取免费 SSL/TLS 证书、配置 Nginx 以实现加密连接以及实施 HSTS 等基本安全措施。通过正确配置的 HTTPS 设置保护您的数据、建立用户信任并提高 SEO。

67 浏览量

使用 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.comwww.your_domain.com 替换为您的实际域名:

sudo certbot --nginx -d your_domain.com -d www.your_domain.com

然后 Certbot 将:

  1. 要求提供您的电子邮件地址: 这用于重要的续订通知和安全警报。
  2. 要求您同意服务条款: 阅读并同意。
  3. 询问您是否希望与 EFF 共享您的电子邮件: 可选。
  4. 检测您现有的 Nginx 虚拟主机: 它将列出找到的域。
  5. 询问您希望如何处理 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_certificatessl_certificate_key 的路径是否准确。

总结

使用 HTTPS 保护您的 Nginx 服务器是建立值得信赖和安全在线存在的关键一步。通过遵循本指南,您已经了解了如何获取和配置 SSL/TLS 证书、自动化续订以及实施基本的安全增强功能。定期审查您的 SSL/TLS 配置并保持服务器软件更新是维护强大安全性的基本实践。

实施 HTTPS 是现代 Web 服务器管理的重要一步。它不仅可以保护用户数据,还可以积极影响网站的声誉和搜索引擎可见性。继续探索高级 Nginx 配置和安全最佳实践,以进一步提高服务器的性能和弹性。