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

更新于:2025-01-016 分钟读完

🛡️ 免费且自动续期:为你的网站配置 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.comwww.example.com必须已经通过 A 记录正确解析到你的 ECS 服务器的公网 IP 地址。你可以使用 pingnslookup 命令进行验证。
  • 服务器环境:确保你的服务器已安装并运行 Nginx
  • 防火墙与安全组这是最容易被忽略的一步
    • 阿里云 ECS 需在安全组规则中放行 TCP 80(用于 HTTP 验证)和 TCP 443(用于 HTTPS)端口的入方向规则。
    • 服务器内部防火墙(如 firewalldiptables)也需允许这两个端口。

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. 同意服务条款:输入 AY 同意 Let’s Encrypt 的服务条款。
  3. 是否分享邮箱:输入 NY。通常选择 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 进行深度检测,目标是获得 AA+ 的评级。这会检查你的 SSL 配置的安全性、协议和密码套件设置。

⏰ 配置自动续期

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

# 测试续期流程(不会真的续期,只是模拟)
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 端口,或域名解析未生效。请检查阿里云安全组规则和服务器防火墙,并使用 dignslookup 确认域名解析到正确的 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 官方文档或寻求社区的帮助。

🔗 相关资源