Let's Encrypt:免费生成HTTPS证书

简介

Let’s Encrypt 是一个免费,自动化和开放的证书颁发机构,由非营利性机构互联网安全研究组(ISRG)驱动。该机构可以为域名颁发免费的 HTTPS 证书,每次证书的有效期为 90 天。

其证书颁发基于 ACME 协议,其中默认使用 ACME v1 协议,泛域名证书需要使用 ACME v2 协议。通过在 Web 服务器上使用支持 ACME 协议的客户端来申请证书。官方推荐使用 Certbot。

安装 Certbot

Certbot 是一个 ACME 协议客户端,它能够自动执行证书的颁发和安装,不会中断服务。

访问 Certbot 网站,选择使用的 Web 服务器和操作系统,网站会给出详细的安装指导。这里以在 Ubuntu 18.04 上使用 Nginx 为例。

sudo apt update
sudo apt install software-properties-common
sudo add-apt-repository ppa: certbot/certbot
sudo apt update
sudo apt install python-certbot-nginx

签发普通证书

sudo certbot --nginx certonly

或者使用 Certbot 提供的插件自动编辑 Nginx 的配置(不推荐):

sudo certbot --nginx

签发泛域名证书

泛域名证书只能使用 DNS 验证的方式,需要单独安装 dns-plugins。但是目前还没有国内云服务商和 DNS 服务商的 plugin,这里只能手动签发。

sudo certbot certonly \
-d "*.example.com" \
--manual \
--preferred-challenges dns \
--server https://acme-v02.api.letsencrypt.org/directory
  • -d 指定域名;
  • --manual 手动签发;
  • --preferred-challenges 指定验证方式,泛域名只能选择 DNS 验证;
  • --server 指定验证服务器 URL,默认为 ACME v1 协议地址,泛域名使用 ACME v2 协议,需要显式指定;

注意,签发泛域名证书会公开服务器的 IP 地址。

按照要求输入邮箱,同意协议,当看到下面信息时:

------------------------------------------------------------
Please deploy a DNS TXT record under the name
_acme-challenge.example.com with the following value:

JHkwGFgXq3OgedI-4RU1X0EcFUz7cxIPN7r1Qyw5JTw

Before continuing, verify the record is deployed.
------------------------------------------------------------
Press Enter to Continue

暂停操作并在 DNS 服务商处配置 TXT 域名解析,记录为 _acme-challenge.example.com,结果为上述字符串。

使用以下命令在服务器上验证解析生效(一般需要几分钟):

dig -t txt _acme-challenge.example.com

生效后,回到 Certbot 申请中回车继续,即可签发成功。

续签证书

普通证书会自动续签,泛域名证书由于是手动生成的,并不能自动续签。

可以使用下面的命令在到期前 30 天手动续签:

sudo certbot renew

重新签发证书

如果因为系统重置等原因,导致证书被删除,可以重新签发证书。

sudo certbot certonly --force-renewal -d example.com

撤销证书

如果证书不再使用,或者密钥被盗,可以撤销证书:

sudo certbot revoke --cert-path /etc/letsencrypt/live/CERTNAME/cert.pem

注意两点:

  • 撤销证书时,需要指定证书路径而不是域名;
  • 指定的证书路径以 cert.pem 结尾,而不是证书的实际名称;

证书撤销后,要删除证书,否则还会自动续签:

certbot delete --cert-name example.com

参考链接

目录