☆

免费为网站配置安全证书指南

更新于:2025-01-01•6 分钟读完

🛡️ 免费且自动续期:为你的网站配置 HTTPS 安全证书全指南

在今天的互联网环境中,HTTPS 已成为网站的“标配”。它不仅能防止数据在传输过程中被窃听和篡改,还能提升用户信任度,并且是搜索引擎(如百度、Google)排名的重要因素。获取 HTTPS 证书通常需要付费,但 Let’s Encrypt 提供了免费、自动化且受主流浏览器信任的证书,是目前个人和中小型网站的最佳选择。本文将手把手教你如何在阿里云 ECS + Nginx 环境下,使用 certbot 工具一键部署 HTTPS,并实现自动续期,彻底告别证书过期的烦恼。

🎯 为什么要用 Let’s Encrypt 和 Certbot?

特性 Let’s Encrypt (通过 Certbot) 阿里云免费 DV 证书
费用 完全免费 免费(有限额)
有效期 90天 3个月
续期 自动化,无需人工干预 需手动下载、上传、配置
域名支持 单域名、多域名、通配符(泛域名) 主要是单域名
申请方式 命令行一键完成 需在控制台手动申请、下载
信任度 根证书已内置于所有主流浏览器 同样受信任
维护成本 一次配置,长期免维护 每季度需重复操作,易遗忘

结论:除非你的域名需要部署在阿里云的特定云产品(如 SLB、CDN)上且希望利用其托管服务,否则对于直接在 ECS 上使用 Nginx 部署的网站,Let’s Encrypt + Certbot 是绝对的首选,因为它真正实现了“一次设置,终身免费”。

📋 部署前准备

在开始之前,请确保你已经完成了以下准备工作,否则申请证书时可能会失败。

1. 域名解析与服务器环境

  • 域名解析生效:你的域名(例如 example.com 和 www.example.com)必须已经通过 A 记录正确解析到你的 ECS 服务器的公网 IP 地址。你可以使用 ping 或 nslookup 命令进行验证。
  • 服务器环境:确保你的服务器已安装并运行 Nginx。
  • 防火墙与安全组:这是最容易被忽略的一步。
    • 阿里云 ECS 需在安全组规则中放行 TCP 80(用于 HTTP 验证)和 TCP 443(用于 HTTPS)端口的入方向规则。
    • 服务器内部防火墙(如 firewalld 或 iptables)也需允许这两个端口。

2. 安装 Certbot 及 Nginx 插件

Certbot 是 Let’s Encrypt 官方推荐的客户端工具,它的 Nginx 插件可以自动完成验证、下载证书并修改 Nginx 配置文件,极大简化了操作。

# 1. 安装 EPEL 源(Certbot 通常在此源中)
sudo yum install -y epel-release
# 2. 安装 certbot 和 nginx 插件
sudo yum install -y certbot python3-certbot-nginx

💡 小贴士:如果你使用的是 Ubuntu/Debian 系统,安装命令为: sudo apt update && sudo apt install -y certbot python3-certbot-nginx 安装后,可以运行 sudo certbot plugins 来验证插件是否成功安装,并使用 sudo nginx -t 检查 Nginx 配置文件的路径。

🚀 申请证书并配置 Nginx

一切准备就绪后,执行以下命令即可申请证书并自动配置 Nginx。

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

交互式提示说明

运行命令后,你需要完成几个交互式步骤:

  1. 输入邮箱地址:输入你的邮箱,用于接收证书过期提醒(这是必填项)。
  2. 同意服务条款:输入 A 或 Y 同意 Let’s Encrypt 的服务条款。
  3. 是否分享邮箱:输入 N 或 Y。通常选择 N,避免收到额外的邮件。
  4. 选择重定向方式:这是最关键的一步。
    • 选项 1: No redirect - 不进行重定向,HTTP 和 HTTPS 都能访问。
    • 选项 2: Redirect - 强烈推荐选择 2。这会将所有 HTTP 请求永久重定向 (301) 到 HTTPS,确保所有流量都经过加密,并提升 SEO 排名。

成功后的样子

成功后,Certbot 会输出类似以下的祝贺信息,并自动重载 Nginx 配置:

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

此时,你的网站已经可以通过 HTTPS 访问了!Certbot 自动在 Nginx 配置文件中(通常在 /etc/nginx/conf.d/ 或 /etc/nginx/sites-available/ 下)添加了类似以下的 SSL 配置:

server {
    listen 443 ssl;
    server_name example.com www.example.com;
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # 由 Certbot 管理
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # 由 Certbot 管理
    # ... 其他 location 配置
}
# HTTP 服务器块已被修改为 301 重定向
server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$host$request_uri;
}

✅ 验证与测试

配置完成后,进行以下验证以确保一切正常。

  1. 浏览器验证:在浏览器中访问 https://example.com,地址栏应该出现 🔒 锁形标志。点击锁图标,可以查看证书详细信息。
  2. 重定向测试:访问 http://example.com,应该自动跳转到 https://example.com。
  3. 专业测试:使用 SSL Labs 进行深度检测,目标是获得 A 或 A+ 的评级。这会检查你的 SSL 配置的安全性、协议和密码套件设置。

⏰ 配置自动续期

Let’s Encrypt 证书的有效期只有 90 天,但 Certbot 在安装时会自动创建一个 systemd timer 或 cron 任务来尝试自动续期证书。 你不需要手动做任何设置,但最好验证一下自动续期是否正常工作。

# 测试续期流程(不会真的续期,只是模拟)
sudo certbot renew --dry-run

如果输出包含 Congratulations, all simulated renewals succeeded,则说明自动续期机制工作正常。

⚠️ 重要提示:请勿手动删除或修改 /etc/letsencrypt/ 目录下的任何文件,这可能会破坏自动续期机制。

🔧 高级配置与故障排查

1. 为多个域名申请同一张证书

Certbot 允许通过多次 -d 参数为多个域名(包括主域名和子域名)申请同一张证书,例如:

sudo certbot --nginx -d example.com -d www.example.com -d blog.example.com -d api.example.com

这样所有指定的域名都可以使用同一张证书。

2. 泛域名证书(通配符证书)

如果你需要为 *.example.com 及其根域名 example.com 申请一张通配符证书,需要使用 DNS 验证方式。Certbot 的 Nginx 插件不支持 DNS 验证,你需要使用 certbot certonly --manual --preferred-challenges dns 命令,并手动添加 DNS TXT 记录。这个过程稍复杂,通常需要结合 acme.sh 等脚本工具通过 API 调用实现全自动。

3. 常见错误排查

错误现象 可能原因及解决方法
The nginx plugin is not working; there may be problems with your existing configuration Nginx 配置文件语法错误或路径不正确。先运行 sudo nginx -t 检查并修复配置错误。如果 Nginx 不是安装在默认路径,使用 --nginx-server-root 参数指定配置目录。
Could not connect to ... for domain verification 防火墙或安全组未开放 80 端口,或域名解析未生效。请检查阿里云安全组规则和服务器防火墙,并使用 dig 或 nslookup 确认域名解析到正确的 IP。
Client with the currently selected authenticator does not support any combination of challenges Certbot 无法找到合适的验证方式。确保 Nginx 正在运行且监听 80 端口,并且 server_name 中包含了你要申请证书的域名。

4. 安全优化建议

在确保 HTTPS 正常工作后,可以进一步优化 Nginx 的 SSL 配置,提升安全性和性能。Certbot 通常会在配置文件中包含 /etc/letsencrypt/options-ssl-nginx.conf,其中已经包含了一些安全设置。你可以考虑:

  • 启用 HSTS (HTTP Strict Transport Security):强制浏览器只通过 HTTPS 连接你的网站,防止 SSL 剥离攻击。在 HTTPS 的 server 块中添加:

    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
  • 优化密码套件:使用强密码套件,禁用弱协议。Certbot 生成的默认配置已经比较安全,但可以根据需要调整。

🔄 备选方案:阿里云免费 DV 证书

尽管推荐 Let’s Encrypt,但了解备选方案也很有必要。阿里云也提供免费的 DV 单域名证书(通常有数量限制),但它的维护成本远高于 Let’s Encrypt。

阿里云免费证书的局限

  1. 有效期短:通常为 3个月。
  2. 需手动续期:证书到期后,需要在阿里云控制台手动申请新证书、下载、上传到服务器并替换旧文件、重启 Nginx。这个过程很容易被遗忘,导致网站中断。
  3. 流程繁琐:整个申请、下载、上传、配置、验证、重启的过程比 Let’s Encrypt 的自动化方式繁琐得多。

适用场景

  • 你的网站必须部署在阿里云的特定云产品上(如 SLB、CDN、WAF),并且希望利用阿里云提供的证书托管服务(证书到期自动续期并自动部署到这些云产品,但仍需手动部署到 ECS 上的 Nginx)。
  • 你的服务器环境无法满足 Let’s Encrypt 的申请条件(例如,无法从外网访问 80 端口)。

💡 总结建议:对于绝大多数直接在 ECS 上使用 Nginx 部署的网站,Let’s Encrypt + Certbot 是更明智、更省心的选择。它免费、自动化、维护成本低。阿里云免费证书更适合作为特定场景下的补充方案。

📝 总结

为网站配置 HTTPS 不再是复杂和昂贵的任务。通过 Let’s Encrypt 和 Certbot,你可以免费、快速、自动化地完成部署,并通过自动续期实现零维护。 核心步骤回顾:

flowchart LR
    A[准备域名解析<br>与服务器环境] --> B[安装 Certbot<br>及 Nginx 插件]
    B --> C[运行 certbot 命令<br>申请证书并自动配置]
    C --> D[验证 HTTPS 访问<br>与 HTTP 重定向]
    D --> E[测试自动续期<br>dry-run]
    E --> F[完成!享受<br>安全、自动的 HTTPS]

希望这份详细的指南能帮助你顺利为你的网站加上 HTTPS 的安全锁。如果你在操作过程中遇到任何问题,欢迎随时查阅 Certbot 官方文档或寻求社区的帮助。

🔗 相关资源: