通过 Let’s Encrypt 申请免费证书

Let's Encrypt 是一家免费提供 TLS 证书的证书颁发机构,简化了网站开启 HTTPS 加密的流程,从而为所有人构建更加安全的互联网。Let's Encrypt 项目由非营利组织互联网安全研究组发起。它的目标是让所有网站都能轻松实现 HTTPS 加密,保障用户数据的安全。通过 Let’s Encrypt,你可以为你的主域名、子域名,甚至泛域名配置安全证书,而且过程完全自动化,不需要手动申请和管理证书.

要申请 Let’s Encrypt 免费证书,通常的做法是使用其自动化工具 Certbot。

安装 Certbot

首先我们要安装 Certbot,根据你使用的操作系统执行对应的安装命令:

如果是 Ubuntu/Debian:

sudo apt update
sudo apt install certbot python3-certbot-nginx  # 如果你使用 Nginx
# 或者
sudo apt install certbot python3-certbot-apache  # 如果你使用 Apache

如果是 CentOS/RHEL:

sudo yum install epel-release
sudo yum install certbot python3-certbot-nginx # 如果你使用 Nginx
# 或者
sudo yum install certbot python3-certbot-apache # 如果你使用 Apache

申请证书

安装完成后,你可以使用 Certbot 自动为你的服务器配置 SSL 证书。

对于 Nginx:

sudo certbot --nginx

对于 Apache:

sudo certbot --apache

certbot 命令会根据参数自动验证域名以及配置 Nginx。

  • 域名验证: Certbot 会与 Let’s Encrypt 服务器通信,验证你对所请求证书的域名的控制权。它通常通过 HTTP-01 挑战进行验证,这意味着 Certbot 会向你的 Nginx 服务器发送一个临时请求,以确保该域名解析到你的服务器。

  • 自动获取证书: 一旦域名验证成功,Let’s Encrypt 会为你的域名颁发 SSL 证书。Certbot 会自动获取这个证书并下载到服务器上。

  • 自动配置 Nginx: Certbot 会自动修改你的 Nginx 配置文件,生成适当的 SSL 配置,确保你的站点可以通过 HTTPS 访问。具体来说:

    • 它会为你的 Nginx 配置文件自动生成与 SSL 相关的配置项,比如证书文件路径、私钥路径等。
    • 证书文件通常位于 /etc/letsencrypt/live/yourdomain.com/ 目录下,Certbot 会把这些路径自动填充到 Nginx 配置中。
    • 如果 Nginx 配置正确,它会设置 443 端口来处理 HTTPS 流量,并配置 HTTP 到 HTTPS 的重定向。
  • 启用 HTTPS: Certbot 在完成上述步骤后,会为你的网站启用 HTTPS。Nginx 服务器会开始使用新的 SSL 证书对请求进行加密。

  • 测试配置: 在修改 Nginx 配置之后,Certbot 会自动重新加载 Nginx 服务器,以使新的 HTTPS 配置生效。

如果你在 Nginx 的配置文件中有多个虚拟主机(vhost),但只想为特定的域名(例如 t.alvinhtml.com)申请证书,使用以下命令:

sudo certbot --nginx -d t.alvinhtml.com

这个命令可以为指定的域名申请证书。更多 certbot 参数 如下:

`-d / --domains`: 指定要申请证书的域名。
示例:`sudo certbot --nginx -d example.com`

`--agree-tos`: 自动同意服务条款。
示例:`sudo certbot --nginx --agree-tos -d example.com`

`--email`: 指定电子邮件地址,接收通知。
示例:`sudo certbot --nginx --email user@example.com -d example.com`

`--redirect`: 自动将 HTTP 流量重定向到 HTTPS。
示例:`sudo certbot --nginx --redirect -d example.com`

`--no-redirect`: 不启用 HTTP 到 HTTPS 的重定向。
示例:`sudo certbot --nginx --no-redirect -d example.com`

`--dry-run`: 模拟申请过程,不实际提交请求。
示例:`sudo certbot --nginx --dry-run -d example.com`

`--staging`: 使用 Let’s Encrypt 测试环境。
示例:`sudo certbot --nginx --staging -d example.com`

`--expand`: 扩展现有证书,添加更多域名。
示例:`sudo certbot --nginx --expand -d example.com -d www.example.com`

`--force-renewal`: 强制续期证书,即使证书还有效。
示例:`sudo certbot --nginx --force-renewal -d example.com`

`--cert-name`: 为证书指定一个名称。
示例:`sudo certbot --nginx --cert-name example-cert -d example.com`

`--manual`: 手动验证域名(DNS 或文件验证)。
示例:`sudo certbot --manual -d example.com`

`--pre-hook`: 在证书申请前执行脚本。
示例:`sudo certbot --nginx --pre-hook "service nginx stop" -d example.com`

`--post-hook`: 在证书申请后执行脚本。
示例:`sudo certbot --nginx --post-hook "service nginx start" -d example.com`

HTTP-01 身份验证

上面有提到 HTTP-01 挑战,什么是 HTTP-01 挑战? 我在网上查了下,HTTP-01 挑战是 Let’s Encrypt 采用的一种验证域名控制权的方法。它通过 HTTP 协议验证申请者对某个域名的控制权,确保该域名确实指向申请证书的服务器。这是 Let’s Encrypt 自动化证书申请过程中常用的一种验证方式。

HTTP-01 挑战工作原理:

请求证书: 当你使用 Certbot 或其他工具申请 SSL 证书时,Let’s Encrypt 会进行域名验证,确保你有权为该域名申请证书。为此,它会通过 HTTP-01 挑战验证你对域名的控制权。

生成验证文件: Certbot 或其他 ACME 客户端会在你的服务器上生成一个临时的验证文件,通常是一个随机的 .well-known/acme-challenge/ 目录下的文件。

该文件包含一个由 Let’s Encrypt 生成的唯一字符串,这个字符串是用来验证的关键。

文件路径通常是:

http://yourdomain.com/.well-known/acme-challenge/{random_string}

Let’s Encrypt 验证文件: Let’s Encrypt 的验证服务器会尝试通过 HTTP 请求来访问你服务器上的验证文件。它会访问:

http://yourdomain.com/.well-known/acme-challenge/{random_string}

服务器响应: 如果你的服务器正确响应该请求,并返回正确的验证文件内容(即与 Let’s Encrypt 发送的文件匹配),则证明你对该域名有控制权,Let’s Encrypt 就会颁发证书。

证书颁发: 验证通过后,Let’s Encrypt 会为该域名颁发 SSL 证书。

为什么使用 HTTP-01 挑战?

  • 简单性:它只需要访问 HTTP 协议,不需要 DNS 配置或其他复杂步骤。
  • 自动化:许多证书管理工具(如 Certbot)可以自动完成验证和证书申请过程。

手动配置 HTTPS

如果 Certbot 没有自动配置 HTTPS,你需要手动更新 Nginx 或 Apache 的配置文件,确保服务器使用 SSL/TLS 并启用安全的 HTTPS。

如果是 Nginx:

在 Nginx 配置文件中加入如下 SSL 设置:

server {
    listen 443 ssl;
    server_name yourdomain.com;

    ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;

    # 其他配置
}

如果是 Apache:

在 Apache 配置文件中,确保启用 SSL 并引用正确的证书路径:

<VirtualHost *:443>
    ServerName yourdomain.com
    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/yourdomain.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/yourdomain.com/privkey.pem

    # 其他配置
</VirtualHost>

然后重启服务器使配置生效:

sudo systemctl restart nginx  # 对于 Nginx
# 或
sudo systemctl restart apache2  # 对于 Apache

自动续期

Certbot 自动续期功能已经内置,不需要手动干预。通常,Certbot 在安装时会自动配置一个定时任务(Cron 任务或系统服务),来定期检查和续期证书。

自动续期的工作原理:

  • 证书有效期:Let’s Encrypt 证书的有效期为 90 天。
  • 续期机制:Certbot 会在证书过期前 30 天 开始自动检查是否需要续期。
  • 续期验证:在续期过程中,Certbot 会再次执行 HTTP-01 或 DNS-01 挑战验证来验证域名控制权。

配置自动续期:

  1. 默认自动续期(通过系统定时任务)

如果你在安装 Certbot 时选择了默认安装选项(例如使用包管理器安装),它通常会自动配置一个定时任务来执行续期。你可以使用以下命令检查是否已经有自动续期的配置:

sudo systemctl list-timers

你应该能看到类似于 certbot.timer 的定时任务,它会在每天的某个时间自动运行并尝试续期证书。

  1. 检查自动续期配置

Certbot 默认会创建一个定时任务(Cron 任务或 systemd 定时器),通常用于自动续期。以下是常见的两种方式:

systemd 定时器: 如果你使用的是现代的 systemd 系统(如 Ubuntu 16.04 及以后版本),安装时 Certbot 会创建一个名为 certbot.timer 的 systemd 定时器。你可以查看该定时器的状态:

sudo systemctl status certbot.timer

如果它显示为 active,则自动续期已启用。

Cron 任务: 对于旧版系统或没有使用 systemd 的系统,Certbot 可能会通过 Cron 任务进行自动续期。你可以查看 Cron 任务列表来确认:

sudo crontab -l

如果安装时启用了自动续期,你应该能看到类似以下内容的条目:

0 */12 * * * certbot renew --quiet

这意味着 Certbot 每 12 小时执行一次续期检查。

Keywords

Let’s Encrypt Certbot 免费证书 证书 HTTPS