使用 Let’s Encrypt 免费申请泛域名 SSL 证书,并实现自动续期
环境准备
在开始之前,确保你具备以下条件:
- 一台可以访问互联网的服务器(Linux 环境,如 Ubuntu/CentOS)。
- Root权限或
sudo权限。 - 一个已解析的域名(本文以
example.com为例)
关于Let’s Encrypt
Let’s Encrypt是一个免费的、自动化的、开放的证书颁发机构(CA),提供免费 SSL 证书。它的目标是让所有网站都能轻松实现 HTTPS 加密,保障用户数据的安全。通过Let’s Encrypt,你可以为你的主域名、子域名,甚至泛域名配置安全证书,而且过程完全自动化,不需要手动申请和管理证书,官方推荐使用 Certbot。
Certbot工作流程
Certbot 是一个自动化工具,用于为网站部署和管理 HTTPS 证书(SSL/TLS 证书)。其核心工作原理基于ACME 协议(Automated Certificate Management Environment),主要步骤如下:
1.初始化
客户端(如 Certbot)向 Let’s Encrypt 注册账户,生成公私钥对,公钥用于身份验证。
2.域名验证
在申请证书之前,Let’s Encrypt 必须验证你对所申请域名的控制权。这是通过以下几种方式进行的:
- HTTP-01 验证:Let’s Encrypt 向你请求创建一个特定的文件,并放在你网站的指定路径下。它通过访问该文件来验证你是否控制该域名。
- DNS-01 验证:Let’s Encrypt 提供一条 DNS TXT 记录,要求你将其添加到域名的 DNS 设置中。它通过检查 DNS 记录来验证你对域名的控制权。
- TLS-ALPN-01验证:通过 TLS 握手时的扩展协议验证,Apache、Nginx 或 Certbot 短期內都不支持这种验证方式。
对于泛域名证书,必须使用DNS-01验证方式,因为 HTTP 验证不能跨域名层级进行。
3.证书申请和签发
一旦验证成功,客户端(如Certbot)生成公私钥对,并将CSR(证书签名请求)发给CA(如Let’s Encrypt) ,CA会生成一个 SSL 证书,并将其发放给申请者。这个证书包含了公钥、域名、有效期等信息,任何人都可以通过该证书与网站进行安全通信。
证书通常包括:
- 域名证书(
cert.pem) - 私钥文件(
privkey.pem) - 中间 CA 证书链(
chain.pem)
4. 证书部署
certbot支持证书的自动部署,如果使用的nginx或者apache的默认配置方式,可以增加--nginx/apache配置选项实现自动部署。当然也可以选择手动部署,也很方便。
5.自动续期
Let’s Encrypt 的证书有效期为90 天,因此需要定期续期。Certbot 自动进行续期验证,确保你的网站不会因为证书过期而遭到用户的安全警告。
安装Certbot
Certbot是由Electronic Frontier Foundation (EFF)提供的一个开源工具,用于自动化从 Let’s Encrypt 获取和管理 SSL 证书。Certbot 会自动为你处理证书申请、安装和续期等过程。
Linux 系统
推荐使用 Linux 的 snapd包管理工具安装Certbot,支持snapd后可以使用如下命令安装Certbot。
sudo snap install --classic certbot #安装Certbot sudo ln -s /snap/bin/certbot /usr/local/bin/certbot #创建一个符号链接,确保可以执行certbot命令(相当于快捷方式)其它系统平台
参考Certbot官网
单域名SSL证书
申请证书
如果你只需要为单个域名(如example.com和www.example.com)申请证书,可以使用以下命令:
sudo certbot -d example.com -d www.example.com如果还有子域名(如,api.example.com),可以在指令上继续增加(-d api.example.com)。
安装并配置证书
经过上面指令,一般会显示你申请成功的提示,并显示证书存储的路径。
默认路径为/etc/letsencrypt/live/<域名>/。
使用以下命令查看证书详细信息
sudo certbot certificatesnginx配置示例
server { listen 80; server_name example.com www.example.com; location / { return 301 https://$host$request_uri; } } server { listen 443 ssl; server_name example.com www.example.com; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # 默认的ssl推荐配置 include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; location / { proxy_pass http://127.0.0.1:8080; } # 如果配置的是静态网站,这里应是你的网站根目录 # location / { # root /html; # index index.html index.htm; # try_files $uri $uri/ =404; # } }如果需要自动配置,增加--nginx。--nginx 需要服务器预先安装nginx,certbot获取到证书后会自动通过修改nginx的配置将证书安装到nginx上。--------没试过
自动续期
Let’s Encrypt 证书的有效期为90 天,为了避免证书过期,我们可以使用Cron Job设置自动续期。
首先,你可以手动测试续期是否正常:
# 首先,你可以手动测试续期是否正常: sudo certbot renew --dry-run # 如果没有报错,可以继续配置自动续期任务: sudo crontab -e # 在打开的编辑器中添加以下行,表示每10天凌晨 2 点执行自动续期任务: 0 2 */10 * * /usr/bin/certbot renew --quiet # --quiet 参数表示静默模式,不会输出非错误信息。一般使用,这样就够了。
泛域名SSL证书
申请证书
泛域名证书(Wildcard Certificate)可以为同一主域名下的所有子域名提供 HTTPS 支持。例如,*.example.com可以覆盖blog.example.com、api.example.com等子域名。
Let’s Encrypt 要求通过DNS-01验证来申请泛域名证书。运行以下命令:
sudo certbot certonly --manual --preferred-challenges dns -d *.example.com -d example.comCertbot 会要求你在 DNS 中创建一个特定的TXT 记录记录以验证域名的所有权。
_acme-challenge.example.com IN TXT "certbot给出的随机字符串"前往你的域名 DNS 管理页面,添加该记录后,返回命令行按下Enter。
如图:
大概等几十秒钟,确保 DNS 记录在全网传播开来,Certbot 可以查询到。
Certbot 在执行验证时会发起 DNS 查询,如果能找到所需的 TXT 记录并验证其值,认证就会成功,然后就会颁发证书。证书颁发后,这条TXT 记录就可以删除了。
这个是手动添加删除 DNS 对应的 TXT 记录,这里只是演示Certbot颁发证书的过程,实际情况下最好采用自动化脚本添加和删除 DNS 的 TXT 解析记录。
安装并配置证书
与之前单域名类似
自动续费
自动续费,需要使用脚本用于处理DNS-01验证的 DNS 记录添加和删除,请参考这篇文章,没有验证过。
