入门:Nginx HTTPS 配置教程 – wiki基地


入门:Nginx HTTPS 配置超详细教程

在现代互联网环境中,数据安全与用户信任变得越来越重要。HTTPS(Hypertext Transfer Protocol Secure)是确保网站数据传输安全、建立用户信任基石的关键技术。它通过在传统的 HTTP 协议之上加入 SSL/TLS(Secure Sockets Layer / Transport Layer Security)加密层,实现数据加密、身份验证和数据完整性。

对于网站或应用的运营者来说,配置 HTTPS 几乎已经成为一项强制要求。搜索引擎(如 Google)会优先收录和排名 HTTPS 网站,主流浏览器会标记非 HTTPS 网站为“不安全”,而用户也更倾向于访问带有绿色锁标志的安全网站。

Nginx 作为一款高性能的开源 Web 服务器,凭借其轻量、高并发处理能力,在全球范围内被广泛使用。本教程将带领完全的初学者,一步步完成 Nginx 服务器上的 HTTPS 配置,让你的网站“亮起”安全锁标志。

本文将涵盖以下内容:

  1. HTTPS 工作原理简介(为何需要证书?)
  2. 获取 SSL/TLS 证书:途径与选择(重点介绍免费的 Let’s Encrypt)
  3. Nginx 基础:安装与配置文件结构概览
  4. 核心配置:修改 Nginx 配置文件启用 HTTPS
  5. 使用 Certbot 自动化配置 Let’s Encrypt 证书(推荐)
  6. 优化 HTTPS 配置:提升安全性和性能
  7. 强制 HTTP 跳转到 HTTPS
  8. 验证配置是否成功
  9. 常见问题与故障排除

目标读者:

  • 对 Linux 命令行有基本了解。
  • 已经拥有一个域名和一个运行着 Nginx 的服务器(可以是云服务器、VPS 或自有服务器)。
  • 希望为自己的网站启用 HTTPS。

重要提示: 在进行任何系统配置更改之前,强烈建议备份您的重要数据和现有配置文件。

第一章:HTTPS 工作原理简介——为何需要证书?

在深入配置之前,我们先简单了解一下 HTTPS 是如何工作的。

想象一下,当你访问一个网站时,你的浏览器(客户端)需要和网站的服务器(服务端)进行通信。

  • HTTP: 数据就像明信片一样在网络中传输,任何人截获都可以看到内容。
  • HTTPS: 数据被放进了一个加密的信封里。这个信封的制作和打开过程,就需要用到 SSL/TLS 协议,而 SSL/TLS 协议的核心就是数字证书

SSL/TLS 连接大致过程(简化版):

  1. 客户端发起连接: 你的浏览器请求访问 https://yourdomain.com
  2. 服务器返回证书: 服务器将自己的数字证书发送给浏览器。
  3. 客户端验证证书: 浏览器接收到证书后,会进行一系列验证:
    • 证书是否由一个受信任的证书颁发机构(CA,Certificate Authority)颁发?
    • 证书是否过期?
    • 证书中的域名是否与你正在访问的域名匹配?
    • 证书是否被吊销?
      这个验证过程依赖于浏览器内置的根证书列表。如果证书是由这些信任的根 CA 签发的,浏览器就认为这个证书是可信的。
  4. 协商加密算法与生成会话密钥: 如果证书验证通过,客户端和服务器会协商使用哪种加密算法,并利用证书中的公钥和服务器的私钥(只有服务器自己知道)安全地生成一个临时的、用于本次会话的对称加密密钥。
  5. 安全通信: 之后的所有数据传输都使用这个会话密钥进行对称加密和解密,确保了通信的机密性和完整性。

总结: 数字证书在这里扮演了“身份证明”的角色。它证明了你连接的服务器确实是 yourdomain.com 的合法拥有者所运行的服务器,并且包含用于安全协商加密通信所需的公钥。没有证书,或者证书不可信,浏览器就不会建立安全的 HTTPS 连接。

第二章:获取 SSL/TLS 证书:途径与选择

要配置 HTTPS,你首先需要一张有效的 SSL/TLS 证书。获取证书有几种主要方式:

  1. 免费证书(推荐:Let’s Encrypt):

    • 优点: 完全免费,自动化程度高,由非营利组织互联网安全研究小组(ISRG)提供。是目前最主流的免费证书服务。
    • 缺点: 有效期较短(通常为90天),需要定期续期(但可以自动化)。
    • 适用场景: 绝大多数个人网站、博客、中小型企业网站。
  2. 商业证书:

    • 优点: 通常有效期更长(1-2年),提供不同级别的验证(域名验证 DV、组织验证 OV、扩展验证 EV),部分提供更高额度的保险。
    • 缺点: 需要付费。
    • 适用场景: 对企业身份验证要求更高、需要更大保险金额、或需要更长有效期的大型企业、金融机构等。
  3. 自签名证书:

    • 优点: 无需第三方,完全免费,生成快速。
    • 缺点: 不会被任何浏览器信任!访问时浏览器会显示显眼的警告信息。
    • 适用场景: 仅用于内部测试、开发环境或已知并信任自签名证书的用户(极少)。切勿用于生产环境对公众开放的网站。

本教程将重点介绍如何使用 Let’s Encrypt 证书,因为它是最适合初学者的免费且自动化的解决方案。 使用 Certbot 工具来获取和管理 Let’s Encrypt 证书是目前最便捷的方式。

第三章:Nginx 基础:安装与配置文件结构概览

假设你的服务器上已经安装了 Nginx。如果还没有,可以通过包管理器进行安装(以 Debian/Ubuntu 为例):

bash
sudo apt update
sudo apt install nginx

安装完成后,Nginx 的主配置文件通常位于 /etc/nginx/ 目录下。

  • 主配置文件:/etc/nginx/nginx.conf。这个文件包含了 Nginx 的全局设置、HTTP 设置等。通常我们不会直接修改这个文件,而是在 http 块内引入其他配置文件。
  • 网站配置目录:/etc/nginx/sites-available/ 存放可用的网站配置文件。
  • 已启用网站目录:/etc/nginx/sites-enabled/ 存放指向 sites-available 中配置文件的软链接。Nginx 实际加载的是这个目录下的配置。
  • 模块配置目录:/etc/nginx/conf.d/ 存放额外的配置片段,通常用于加载模块或特定的通用设置。nginx.conf 中通常会包含 include /etc/nginx/conf.d/*.conf; 来加载这里的所有 .conf 文件。

通常,我们会为每一个网站(虚拟主机)创建一个独立的配置文件放在 /etc/nginx/sites-available/ 下,然后为其在 /etc/nginx/sites-enabled/ 创建一个软链接来启用它。

一个基本的 HTTP 网站配置文件可能长这样(位于 /etc/nginx/sites-available/yourdomain.com.conf):

“`nginx

文件路径: /etc/nginx/sites-available/yourdomain.com.conf

server {
listen 80; # 监听80端口,处理HTTP请求
server_name yourdomain.com www.yourdomain.com; # 你的域名

root /var/www/yourdomain.com/html; # 网站文件根目录
index index.html index.htm; # 默认首页文件

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

# 其他可能的配置,如日志、错误页等
error_log /var/log/nginx/yourdomain.com.error.log;
access_log /var/log/nginx/yourdomain.com.access.log;

}
“`

要启用这个配置,创建软链接:

bash
sudo ln -s /etc/nginx/sites-available/yourdomain.com.conf /etc/nginx/sites-enabled/

然后检查配置并重载 Nginx:

bash
sudo nginx -t # 检查配置语法
sudo systemctl reload nginx # 重载配置

第四章:核心配置:修改 Nginx 配置文件启用 HTTPS

启用 HTTPS 需要修改你的 Nginx 网站配置文件(例如 /etc/nginx/sites-available/yourdomain.com.conf)。主要任务是添加或修改一个 server 块来监听 HTTPS 默认端口 443,并指向你的 SSL/TLS 证书文件和私钥文件。

你需要获取到两个主要文件:

  1. 证书文件 (.crt.pem): 包含你的服务器证书以及颁发者的中间证书(如果需要)。这个文件向访问者证明你的身份。
  2. 私钥文件 (.key.pem): 一个私密的、只有你的服务器知道的密钥。它与证书中的公钥配对,用于解密客户端发送的加密数据以及在握手过程中证明身份。私钥文件是极其重要的,需要妥善保管,不能泄露。

假设你已经通过某种方式(后面我们会讲 Certbot)获取了这两个文件,并且知道它们存放的路径。

现在,修改你的 Nginx 配置文件,添加一个监听 443 端口的 server 块:

“`nginx

文件路径: /etc/nginx/sites-available/yourdomain.com.conf

HTTP 块 (可以保留,用于将 HTTP 请求重定向到 HTTPS)

server {
listen 80;
server_name yourdomain.com www.yourdomain.com;

# 重定向到 HTTPS
return 301 https://$host$request_uri;

}

HTTPS 块

server {
listen 443 ssl; # 监听443端口,并启用SSL/TLS
server_name yourdomain.com www.yourdomain.com; # 你的域名

# --- SSL/TLS 证书配置 ---
ssl_certificate /path/to/your_domain.crt; # 证书文件路径
ssl_certificate_key /path/to/your_domain.key; # 私钥文件路径
# ------------------------

# --- 网站根目录和索引文件 ---
root /var/www/yourdomain.com/html;
index index.html index.htm;
# ---------------------------

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

# --- 其他可能的配置,如日志、错误页等 ---
error_log /var/log/nginx/yourdomain.com.error.log;
access_log /var/log/nginx/yourdomain.com.access.log;
# ----------------------------------------

# --- 推荐的 SSL/TLS 安全配置 (见下一章) ---
# 这些配置可以放在这里,或者放在 conf.d 目录下的独立文件,然后在这里 include
# 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:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA384';
# ssl_prefer_server_ciphers on; # 服务器密码套件优先
# ssl_session_cache shared:SSL:10m; # 开启会话缓存
# ssl_session_timeout 10m; # 会话超时时间
# ssl_session_tickets off; # 禁用会话票证 (安全性考虑,除非有特殊需求)
# ssl_stapling on; # 开启 OCSP Stapling (提高性能和安全性)
# ssl_stapling_verify on; # 验证 OCSP 响应
# resolver 8.8.8.8 8.8.4.4 valid=300s; # 设置 DNS 服务器用于 OCSP Stapling 验证 (改为你信任的DNS)
# resolver_timeout 5s;
# add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; # 开启 HSTS (强制使用 HTTPS)
# ----------------------------------------------------------------------------

}
“`

解释:

  • listen 443 ssl;: 这告诉 Nginx 监听标准 HTTPS 端口 443,并且启用 SSL/TLS 层。
  • ssl_certificate /path/to/your_domain.crt;: 指定你的服务器证书文件(包含中间证书)的绝对路径。
  • ssl_certificate_key /path/to/your_domain.key;: 指定你的私钥文件的绝对路径。
  • 第一个 server 块监听 80 端口,并将所有 HTTP 请求重定向到相应的 HTTPS URL。$host 是请求头中的主机名(yourdomain.com 或 www.yourdomain.com),$request_uri 是请求的路径和参数。return 301 表示永久重定向。

修改完配置文件后,别忘了检查语法并重载 Nginx:

bash
sudo nginx -t
sudo systemctl reload nginx

现在,如果你直接访问 https://yourdomain.com,Nginx 应该会尝试建立 HTTPS 连接。但是,如何获取证书文件呢?这就是 Certbot 发挥作用的地方。

第五章:使用 Certbot 自动化配置 Let’s Encrypt 证书(推荐)

Certbot 是一个由电子前哨基金会(EFF)开发的免费、开源工具,可以自动化从 Let’s Encrypt 获取、安装和续期证书的过程。它有针对 Nginx 的插件,可以自动修改 Nginx 配置文件。

步骤1:安装 Certbot 和 Nginx 插件

根据你的操作系统,安装 Certbot 和 Nginx 插件。对于 Debian/Ubuntu 系统:

bash
sudo apt update
sudo apt install certbot python3-certbot-nginx

对于 CentOS/RHEL 系统:

“`bash
sudo yum install epel-release
sudo yum install certbot python3-certbot-nginx

或者使用 snapd

sudo snap install core; sudo snap refresh core

sudo snap install –classic certbot

sudo ln -s /snap/bin/certbot /usr/bin/certbot

“`

步骤2:使用 Certbot 获取并安装证书

运行 Certbot Nginx 插件,它会自动检测你的 Nginx 配置,为你颁发证书并修改配置文件。

bash
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com

解释上面的命令:

  • sudo certbot: 运行 Certbot 命令。
  • --nginx: 使用 Nginx 插件。Certbot 会尝试找到你的 Nginx 配置文件并进行修改。
  • -d yourdomain.com -d www.yourdomain.com: 指定你希望为哪些域名颁发证书。如果你的网站同时支持 yourdomain.comwww.yourdomain.com,你需要把它们都列出来。Certbot 需要验证这些域名的所有权,通常通过在你的服务器上创建一个临时文件,Let’s Encrypt 服务器通过 HTTP 访问这个文件来验证。因此,你的域名必须指向当前运行 Nginx 的服务器,并且 80 端口必须开放。

运行命令后,Certbot 会进行以下操作:

  1. 域名验证: 通过 HTTP 向 Let’s Encrypt 服务器证明你拥有这些域名。
  2. 颁发证书: 成功验证后,Let’s Encrypt 会颁发证书文件和私钥文件。
  3. 修改 Nginx 配置: Certbot 会找到你的 Nginx 配置文件(通常是在 sites-enabled 中),自动添加一个监听 443 端口的 server 块(如果不存在)或者修改已有的 443 块,并配置 ssl_certificatessl_certificate_key 指向新颁发的证书文件。它还可能会问你是否要将 HTTP 请求自动重定向到 HTTPS。选择重定向(通常是选项 2)是强烈推荐的。
  4. 重载 Nginx: Certbot 会自动重载 Nginx 配置使更改生效。

Certbot 交互过程示例(可能会遇到的提示):

“`
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins running in auto mode.
The following domains are already configured to receive certs:
– yourdomain.com
– www.yourdomain.com
You are running certbot in non-interactive mode, but there exists
at least one previously deployed certificate that covers a subset
of the requested domains.

Would you like to reinstall this certificate and replace the old one?

1: Keep the existing certificate for now
2: Renew and replace the certificate


Select the appropriate number [1-2] then [enter] (press ‘c’ to cancel): 2 # 如果是第一次安装,可能不会有这个提示

Deploying certificate for yourdomain.com and www.yourdomain.com

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.

1: No redirect – Make no changes to the Nginx configuration.
2: Redirect – Make all requests redirect to secure HTTPS access.


Select the appropriate number [1-2] then [enter] (press ‘c’ to cancel): 2 # 选择重定向

Redirecting all traffic on port 80 to ssl.


Congratulations! You have successfully enabled https://yourdomain.com and https://www.yourdomain.com

You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=yourdomain.com


IMPORTANT NOTES:
– Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/yourdomain.com/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/yourdomain.com/privkey.pem
Your cert will expire on 2023-12-12. To obtain a new or tweaked
version of this certificate in the future, simply run certbot renew

“`

请注意 Certbot 提示你的证书文件和私钥文件的路径(通常在 /etc/letsencrypt/live/你的主域名/ 下)以及证书的过期时间。

步骤3:自动化续期

Let’s Encrypt 证书有效期只有90天。Certbot 会自动在你的系统上设置一个定时任务(cron job 或 systemd timer)来检查并续期证书。你不需要手动操作,但可以测试续期过程是否正常:

bash
sudo certbot renew --dry-run

这个命令会模拟证书续期过程,检查是否有问题,但不会真正进行续期。如果没有错误提示,说明自动续期应该能够正常工作。

至此,你已经成功使用 Certbot 为你的 Nginx 网站配置了 Let’s Encrypt HTTPS。

第六章:优化 HTTPS 配置:提升安全性和性能

Certbot 自动生成的 Nginx 配置已经可以使用,但为了更好的安全性和性能,我们可以进行一些优化。这些配置通常可以放在 443 端口的 server 块内。

1. 启用安全的协议版本 (ssl_protocols)

禁用过时且不安全的 TLS 版本(如 TLSv1.0 和 TLSv1.1),只保留 TLSv1.2 和 TLSv1.3。

nginx
ssl_protocols TLSv1.2 TLSv1.3;

2. 选择安全的密码套件 (ssl_ciphers)

密码套件决定了加密算法、密钥交换算法等。选择现代且安全的密码套件,并优先使用服务器推荐的顺序。

nginx
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA384';
ssl_prefer_server_ciphers on; # 优先使用服务器端指定的密码套件顺序

这是一个常见的推荐列表,但最佳实践会随时间演变,建议参考 SSL Labs 等权威机构的建议。

3. 开启 SSL 会话缓存 (ssl_session_cache, ssl_session_timeout)

客户端和服务端每次建立 TLS 连接都需要进行握手,这会消耗计算资源。开启会话缓存可以让客户端在一定时间内重新连接时,复用之前的会话密钥,跳过耗时的握手过程,提升性能。

nginx
ssl_session_cache shared:SSL:10m; # 创建一个名为SSL的共享缓存,大小10MB
ssl_session_timeout 10m; # 会话超时时间

4. 配置 Diffie-Hellman 参数 (ssl_dhparam)

对于使用 Diffie-Hellman 密钥交换算法的密码套件,配置一个自定义的、足够强大的 Diffie-Hellman 参数可以增强安全性,防止 Logjam 攻击。你需要先生成这个文件:

“`bash
sudo openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048

或者更安全的 4096 位

sudo openssl dhparam -out /etc/nginx/ssl/dhparam.pem 4096

“`

这个过程可能需要几分钟甚至更长时间(特别是 4096 位)。生成后,在 Nginx 配置中引用它:

nginx
ssl_dhparam /etc/nginx/ssl/dhparam.pem; # 指向你生成的dhparam文件路径

5. 开启 OCSP Stapling (ssl_stapling, ssl_stapling_verify, resolver)

OCSP(Online Certificate Status Protocol)用于检查证书是否被吊销。通常浏览器需要自己去 CA 的 OCSP 服务器查询,这会增加延迟并泄露用户隐私。OCSP Stapling 是让服务器主动获取 OCSP 状态并在 TLS 握手时“钉”(staple)给客户端,客户端无需额外查询,从而加快连接速度并保护用户隐私。

“`nginx
ssl_stapling on;
ssl_stapling_verify on;

设置 DNS 服务器用于 OCSP Stapling 验证。请替换为你的服务器可以正常解析域名的DNS

比如 Google DNS: 8.8.8.8, 8.8.4.4

比如 Cloudflare DNS: 1.1.1.1, 1.0.0.1

valid 参数设置 DNS 记录的缓存时间

resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
“`

6. 开启 HTTP Strict Transport Security (HSTS) (add_header Strict-Transport-Security)

HSTS 是一项重要的安全策略。一旦用户通过 HTTPS 访问了你的网站,你的服务器会发送一个特殊的 HTTP 头部。浏览器接收到这个头部后,在指定的有效期内,即使下次用户输入的是 http://yourdomain.com,浏览器也会强制使用 HTTPS 连接,而不会先尝试 HTTP。这可以防止中间人攻击(如 SSL stripping)。

nginx
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

解释 HSTS 头部的参数:

  • max-age=31536000: 浏览器记住 HSTS 策略的有效期,这里是 31536000 秒,即一年。设置得长一些会更安全。
  • includeSubDomains: 可选参数,如果包含,则此策略也适用于所有子域名。
  • preload: 可选参数。将你的域名提交到 HSTS Preload List 后,主流浏览器会内置你的域名,首次访问时无需先收到 HSTS 头部即可强制使用 HTTPS。提交到这个列表需要满足一些条件(如根域名和所有子域名都必须支持 HTTPS 并包含 includeSubDomains 标记)。这是一个更高级的优化,你可以访问 hstspreload.org 查看详情和提交。

将这些优化配置添加到你的 HTTPS server 块中:

“`nginx
server {
listen 443 ssl;
server_name yourdomain.com www.yourdomain.com;

ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem; # Certbot 证书路径
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem; # Certbot 私钥路径

# --- 优化配置开始 ---
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:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA384';
ssl_prefer_server_ciphers on;

ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_session_tickets off; # 推荐禁用,除非需要无状态会话

# 如果你生成了 dhparam 文件,在这里引用
# ssl_dhparam /etc/nginx/ssl/dhparam.pem;

ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s; # 使用你的 DNS 服务器
resolver_timeout 5s;

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
# --- 优化配置结束 ---

root /var/www/yourdomain.com/html;
index index.html index.htm;

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

error_log /var/log/nginx/yourdomain.com.error.log;
access_log /var/log/nginx/yourdomain.com.access.log;

}
“`

修改完成后,再次检查语法并重载 Nginx:

bash
sudo nginx -t
sudo systemctl reload nginx

第七章:强制 HTTP 跳转到 HTTPS

这通常是通过在 Nginx 配置中添加一个监听 80 端口的 server 块来实现的。前面 Certbot 在安装时通常会询问是否进行重定向,如果选择了是,它会自动为你添加。如果 Certbot 没有自动添加,或者你想手动控制,可以参考这个示例:

“`nginx
server {
listen 80;
server_name yourdomain.com www.yourdomain.com; # 你的域名

# 将所有 HTTP 请求 301 永久重定向到 HTTPS
# $host 会是请求头中的域名 (yourdomain.com 或 www.yourdomain.com)
# $request_uri 会是请求的路径和查询参数 (/page?arg=value)
return 301 https://$host$request_uri;

# 也可以这样写,更简洁,但功能相同
# return 301 https://$server_name$request_uri;

}

下面是你的 HTTPS server 块 (监听 443 端口)

server {
listen 443 ssl;
server_name yourdomain.com www.yourdomain.com;
# … HTTPS 配置 …
}
“`

这个配置确保了即使访问者输入的是 HTTP 地址,也会被自动且永久地跳转到安全的 HTTPS 地址。

第八章:验证配置是否成功

配置完成后,你需要验证 HTTPS 是否正常工作:

  1. 浏览器检查:

    • 在浏览器地址栏输入 https://yourdomain.com
    • 查看地址栏左侧是否有绿色的锁标志(或类似的安全指示)。点击锁标志,查看证书详情,确认证书是为你当前的域名颁发且由信任的 CA 签发(如 Let’s Encrypt)。
    • 尝试访问 http://yourdomain.com,看是否会自动跳转到 https://yourdomain.com
  2. 在线 SSL 测试工具:

    • 使用像 SSL Labs 的 SSL Server Test 这样的在线工具,输入你的域名进行全面扫描。
    • 这个工具会检查你的证书链、协议支持、密码套件、HSTS、OCSP Stapling 等多项安全配置。
    • 目标是获得 A 或 A+ 的评分。如果得分较低,工具会给出详细的建议,你可以根据建议调整 Nginx 配置。

第九章:常见问题与故障排除

1. Nginx 配置语法错误:

  • 症状: 重载或启动 Nginx 失败,命令行报错提示配置文件有问题。
  • 解决: 仔细检查命令输出的错误信息,通常会指示出错的文件和行号。运行 sudo nginx -t 可以提前检查配置语法。常见错误包括:拼写错误、缺少分号 ;、大括号 {} 不匹配、文件路径错误等。

2. 无法访问 HTTPS 网站:

  • 症状: 浏览器访问 https://yourdomain.com 提示连接超时或拒绝连接。
  • 解决:
    • 防火墙: 检查服务器的防火墙是否允许 443 端口的入站连接。如果使用 ufw,运行 sudo ufw allow 'Nginx HTTPS'sudo ufw allow 443/tcp。如果使用云服务商的安全组,请在控制台放行 443 端口。
    • Nginx 是否在运行并监听 443 端口: 运行 sudo systemctl status nginx 查看 Nginx 状态。运行 sudo netstat -tulnp | grep nginx 查看 Nginx 正在监听的端口,确保有 0.0.0.0:443:::443
    • 证书和私钥路径是否正确: 检查 Nginx 配置文件中 ssl_certificatessl_certificate_key 的路径是否准确,并且 Nginx 进程对这些文件有读取权限。Certbot 颁发的证书文件通常在 /etc/letsencrypt/live/你的域名/ 下,这个目录及其文件通常是安全的,Nginx 可以读取。

3. 证书不受信任:

  • 症状: 浏览器访问 HTTPS 网站时提示“证书不受信任”、“隐私错误”等警告信息,而不是绿色的锁。
  • 解决:
    • 证书链不完整: 确保 ssl_certificate 指向的文件包含完整的证书链(服务器证书 + 中间证书)。Certbot 提供的 fullchain.pem 文件通常是完整的。如果你手动配置,可能需要将服务器证书和中间证书合并到一个文件中。
    • 证书颁发机构不受信任: 如果你使用了自签名证书或非主流 CA 证书,浏览器可能不信任。对于公共网站,请使用 Let’s Encrypt 或商业 CA 证书。
    • 域名不匹配: 证书中的域名(Subject Alternative Name 或 Common Name)必须与用户访问的域名完全匹配。如果用户访问 www.yourdomain.com 但证书只包含 yourdomain.com,就会出现警告。使用 Certbot 时,请确保在 -d 参数中包含所有需要覆盖的域名。
    • 证书过期: 检查证书是否过期。Certbot 颁发的证书有效期90天,需要自动续期。运行 sudo certbot renew --dry-run 检查续期是否正常。

4. 网站部分内容不安全(混合内容):

  • 症状: 地址栏显示黄色警告锁或灰色锁,控制台有“Mixed Content”警告。
  • 解决: 这意味着你的网页在 HTTPS 连接下,尝试加载了通过 HTTP 引用的资源(如图片、CSS、JavaScript、字体文件等)。
    • 检查网页源代码: 使用浏览器的开发者工具(F12)查看控制台的 Mixed Content 警告,找到通过 HTTP 加载的资源链接。
    • 修改资源链接: 将这些资源链接修改为使用 HTTPS (https://) 或使用相对路径,或者使用协议无关的 URL(//domain.com/path/resource)。对于静态资源,这通常比较容易。对于动态生成的内容或第三方资源,可能需要修改网站代码或配置。

5. 重定向循环:

  • 症状: 访问网站时浏览器提示重定向次数过多。
  • 解决: 通常是 HTTP 到 HTTPS 的重定向配置有问题。检查你的 Nginx 配置,确保:
    • 80 端口的 server 块正确地将请求重定向到 443 端口的对应域名。
    • 443 端口的 server没有将请求再次重定向回 HTTP。
    • 如果在反向代理后面,确保代理服务器将正确的协议(HTTP/HTTPS)信息传递给 Nginx(例如通过 X-Forwarded-Proto 头部),并且 Nginx 使用这些信息来决定是否重定向。

总结

恭喜你!通过本教程,你已经了解了 HTTPS 的基本原理,学会了如何使用 Nginx 配置 HTTPS,并且掌握了利用 Certbot 获取和管理 Let’s Encrypt 证书的自动化方法。我们还探讨了如何优化配置以提升安全性和性能,以及如何解决一些常见的配置问题。

启用 HTTPS 是保障网站安全、提升用户信任和搜索引擎排名的重要一步。虽然初次接触可能会觉得有些复杂,但一旦配置成功并理解了基本原理,后续的管理(尤其是 Certbot 的自动化续期)就会变得非常简单。

请记住,网络安全是一个持续的课题。定期检查你的 SSL 配置(例如使用 SSL Labs),关注安全新闻,并及时更新你的服务器软件和配置是保持网站安全的重要习惯。

希望这篇详细的入门教程能帮助你顺利地为你的 Nginx 网站加上这把安全锁!

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部