Let’s Encrypt 安装通配符证书

不用为二级域名申请证书了,但是有效期只有 3 个月。

安装 certbot

官网:https://certbot.eff.org

certbot 官网有安装向导。打开向导页面,选择你对应的操作系统和网页服务器,它会告诉你怎么做。

1
2
3
4
5
6
# Apache on Ubuntu 18.04 LTS (bionic)
sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository universe
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update

申请证书

这一步需要更改 DNS 的解析记录,有个坑要注意一下:更改 DNS 记录要等大约 10 分钟才生效,最好用 screen 或者其他命令保证终端不会超时退出。

1
certbot certonly -d "*.beanbang.cn" -d "beanbang.cn" --manual --preferred-challenges dns-01  --server https://acme-v02.api.letsencrypt.org/directory
  • certonly 表示插件,Certbot 有很多插件。不同的插件都可以申请证书,用户可以根据需要自行选择。
  • -d 为哪些主机申请证书。如果是通配符,输入 *.xxx.com (根据实际情况替换为你自己的域名)。
  • --preferred-challenges dns-01 使用 DNS 方式校验域名所有权。
  • --server Let's Encrypt ACME v2 版本使用的服务器不同于 v1 版本,需要显示指定。

执行之后会有提示你记录 IP 地址之类的,确定就是了。之后会提示需要你验证你的域名:

1
2
3
4
5
6
7
8
9
10
Please deploy a DNS TXT record under the name
_acme-challenge.beanbang.cn with the following value:

ErR2BtnzPzdz8zFMW-IK663dM-sWjvXZtjFRwKkkAMU

Before continuing, verify the record is deployed.
(This must be set up in addition to the previous challenges; do not remove,
replace, or undo the previous challenge tasks yet. Note that you might be
asked to create multiple distinct TXT records with the same name. This is
permitted by DNS standards.)

括号里的内容说,不要删除和改动先前的记录,你可能被要求向同一个名字(二级域名)添加多条 TXT 记录,这个是 DNS 标准所允许的。

新建一个连接,用 dig 命令来测试。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ dig -t txt _acme-challenge.beanbang.cn

; <<>> DiG 9.10.3-P4-Ubuntu <<>> -t txt _acme-challenge.beanbang.cn
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 38548
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;_acme-challenge.beanbang.cn. IN TXT

;; ANSWER SECTION:
_acme-challenge.beanbang.cn. 592 IN TXT "pxQrBuCbDVTP9FIGR55BGZGjVqPXbSN2nNwN3jTUUyI"
_acme-challenge.beanbang.cn. 592 IN TXT "shrER0qocOoMedzQGum94cb_wHihcbzIGvJWB2t7vOY"

;; Query time: 0 msec
;; SERVER: 10.236.158.106#53(10.236.158.106)
;; WHEN: Mon Apr 06 23:11:01 CST 2020
;; MSG SIZE rcvd: 168

如果你发现解析记录已经成功改变了,就可以按下回车。

成功之后会有下面的提示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Waiting for verification...
Resetting dropped connection: acme-v02.api.letsencrypt.org
Cleaning up challenges

IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/beanbang.cn/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/beanbang.cn/privkey.pem
Your cert will expire on 2020-04-06. To obtain a new or tweaked
version of this certificate in the future, simply run certbot
again. To non-interactively renew *all* of your certificates, run
"certbot renew"
- If you like Certbot, please consider supporting our work by:

Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le

这时候应该能看到 /etc/letsencrypt/live/[域名] 下的证书文件:

1
2
$ ls /etc/letsencrypt/live/beanbang.cn/
cert.pem chain.pem fullchain.pem privkey.pem README

四个证书文件

查了一下文档1,这四个证书文件分别的不同用途,大概是这样:

  • privkey.pem

    证书的私钥,必须时刻保护好。不能公开给任何人。

    配置项:Apache 的 SSLCertificateKeyFile,Nginx 的 ssl_certificate_key

  • fullchain.pem

    完整的证书密钥链(certificate chain)包括服务端证书(server/leaf certificate)和中间证书(intermediate certificate)。在文件最开头第一个服务端证书,接下来的是中间证书。

    配置项: Apache >= 2.4.8 的 SSLCertificateFile ,Nginx 的 ssl_certificate

  • cert.pemchain.pem (较少用)

    cert.pem 包含了服务器端证书,chain.pem 包含了中间证书。假如你要使用它们,必须两个文件一起使用,不然浏览器会提示“链接不受信任”。

    配置项:Apache < 2.4.8 的 SSLCertificateFileSSLCertificateChainFile。启用了 OSCP 的 Nginx >= 1.3.7,需要将 ssl_trusted_certificate 设置为 chain.pem

配置网页服务器

我用的是 Apache。找到 Apache 的配置文件 httpd-ssl.conf,并且修改相应的内容,把证书添加上去。

1
2
cd /opt/lampp
vim etc/extra/httpd-ssl.conf
1
2
3
4
5
6
7
8
<VirtualHost 0.0.0.0:443>
DocumentRoot "/opt/lampp/htdocs/hexo/"
ServerName blog.beanbang.cn
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/beanbang.cn/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/beanbang.cn/privkey.pem
#SSLCertificateChainFile /etc/letsencrypt/live/beanbang.cn/
</VirtualHost>

更新证书

通配符证书似乎不支持用 certbot renew 来更新,重新执行一下上面申请证书的命令来更新证书。证书时长是三个月,在到期的前 10 天 Let's Encrypt 会发邮件提醒你。


参见:


  1. User Guide — Certbot 1.0.0.dev0 documentation↩︎