190424-Let-s-Encrypt-配置泛域名通用证书

Let’s Encrypt 配置泛域名通用证书

什么是 Let’s Encrypt

部署 HTTPS 网站的时候需要证书,证书由 CA 机构签发,大部分传统 CA 机构签发证书是需要收费的,这不利于推动 HTTPS 协议的使用。

Let’s Encrypt 也是一个 CA 机构,但这个 CA 机构是免费的。也就是说签发证书不需要任何费用。Let’s Encrypt 由于是非盈利性的组织,需要控制开支,他们搞了一个非常有创意的事情,设计了一个 ACME 协议。

那为什么要创建 ACME 协议呢,传统的 CA 机构是人工受理证书申请、证书更新、证书撤销,完全是手动处理的。而 ACME 协议规范化了证书申请、更新、撤销等流程,只要一个客户端实现了该协议的功能,通过客户端就可以向 Let’s Encrypt 申请证书,也就是说 Let’s Encrypt CA 完全是自动化操作的。

任何人都可以基于 ACME 协议实现一个客户端,官方推荐的客户端是Certbot

什么是通配符证书

在没有出现通配符证书之前,Let’s Encrypt 支持两种证书。

  1. 单域名证书:
    证书仅仅包含一个主机。
  2. SAN证书
    也称为多域名证书,用于利用一个单个的证书保护多个域名。它们与通配符证书不同的地方在于,支持一个域名下所有无限个子域名。SAN仅支持在证书中输入的完全限定性域名。SAN证书是令人印象深刻的,因为使用它们,你便能够利用一个单个的证书保护超过100个不同的完全限定性域名;然而,保护的数量取决于发行的证书机构
  3. 17年左右,开始支持通配符证书
    通配符(Wildcard)证书——通配符证书广泛用于保护一个独特的完全限定性域名下的多个子域名。这种证书的好处是,它不仅使管理证书变得简单,而且还能帮助你降低管理费用。它能够随时保护你当前和将来的子域名。

Wildcard VS SAN证书

  1. 通配符证书与正常的SSL证书并没有什么差别,只不过前者支持在完全限定性域名上添加一个通配符字符“*”作为前缀,这就使得它能够保护多个服务。使用通配符证书并不会涉及任何特定服务,而是它们总是会将一个通配符字符作为前缀加入到域名中

  2. SAN证书不与通配符证书兼容。如果你购买了一个SAN证书,那么在购买证书时,你的所有子域名就必须在证书中登记为一个独特的域名条目。因此,每当你决定添加或移动一个域名时,你就必须更新或在每台主机服务器上重新部署证书

申请通配符证书

Let’s Encrypt 上的证书申请是通过 ACME 协议来完成的。ACME 协议规范化了证书申请、更新、撤销等流程,实现了 Let’s Encrypt CA 自动化操作。解决了传统的 CA 机构是人工手动处理证书申请、证书更新、证书撤销的效率和成本问题。

ACME v2 是 ACME 协议的更新版本,通配符证书只能通过 ACME v2 获得。要使用 ACME v2 协议申请通配符证书,只需一个支持该协议的客户端就可以了,官方推荐的客户端是 Certbot

客户在申请 Let’s Encrypt 证书的时候,需要校验域名的所有权,证明操作者有权利为该域名申请证书,目前支持三种验证方式:

  1. dns01:给域名添加一个 DNS TXT 记录。
  2. http01:在域名对应的 Web 服务器下放置一个 HTTP well-known URL 资源文件
  3. tls-sni01:在域名对应的 Web 服务器下放置一个 HTTPS well-known URL 资源文件

申请通配符证书,只能使用 dns验证的方式,下面开始申请

获取certbot 客户端

1
2
3
4
5
6
# 下载 Certbot 客户端
$ wget -c https://dl.eff.org/certbot-auto -P /usr/local/bin/
# 设为可执行权限
$ chmod a+x /usr/local/bin/certbot-auto
$ certbot-auto --version
certbot 1.3.0

注: Certbot 0.22.0 以上版本支持ACME v2 协议.

开始申请证书

1
certbot-auto certonly  -d *.laosan.xin --manual --preferred-challenges dns --server https://acme-v02.api.letsencrypt.org/directory
  • certonly,表示安装模式,Certbot 有安装模式和验证模式两种类型的插件。
  • -d 为那些主机申请证书,如果是通配符,输入 *.example.com
  • –manual 表示手动安装插件,Certbot 有很多插件,不同的插件都可以申请证书,用户可以根据需要自行选择
  • –preferred-challenges dns,使用 DNS 方式校验域名所有权
  • –server,Let’s Encrypt ACME v2 版本使用的服务器不同于 v1 版本,需要显示指定

执行完以上命令之后,就是命令行的输出,根据提示输入相应内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator manual, Installer None
Obtaining a new certificate
Performing the following challenges:
dns-01 challenge for laosan.xin

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NOTE: The IP of this machine will be publicly logged as having requested this
certificate. If you're running certbot in manual mode on a machine that is not
your server, please ensure you're okay with that.

Are you OK with your IP being logged?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: y

以上确认后继续,以下提示要求配置 DNS TXT 记录,从而校验域名所有权,也就是判断证书申请者是否有域名的所有权。

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

AREePsKVCwivUzQ24tE94Va6CxwZKSU9nAyv5FxPmyw

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

上面输出要求给 _acme-challenge.laosan.xin 配置一条 TXT 记录,在没有确认 TXT 记录生效之前不要回车执行。请自行登录域名管理系统,比如我在aliyun买的域名,以下是我在域名解析里面配置的TXT记录.

dns01-challenge

然后输入下列命令确认 TXT 记录是否生效:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@laosanxin ~]# dig  -t txt  _acme-challenge.laosan.xin @8.8.8.8

; <<>> DiG 9.9.4-RedHat-9.9.4-74.el7_6.2 <<>> -t txt _acme-challenge.laosan.xin @8.8.8.8
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 16662
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;_acme-challenge.laosan.xin. IN TXT

;; ANSWER SECTION:
_acme-challenge.laosan.xin. 599 IN TXT "AREePsKVCwivUzQ24tE94Va6CxwZKSU9nAyv5FxPmyw"

;; Query time: 94 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: 日 5月 03 11:12:12 CST 2020
;; MSG SIZE rcvd: 279

确认生效后,回车执行,输出如下信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/laosan.xin/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/laosan.xin/privkey.pem
Your cert will expire on 2020-07-30. To obtain a new or tweaked
version of this certificate in the future, simply run certbot-auto
again. To non-interactively renew *all* of your certificates, run
"certbot-auto 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

此时我们的证书已经申请成功了,证书都保存在如下目录中:

1
2
3
4
5
6
7
8
9
[root@laosanxin ~]#  tree /etc/letsencrypt/live/laosan.xin
/etc/letsencrypt/live/laosan.xin
├── cert.pem -> ../../archive/laosan.xin/cert1.pem
├── chain.pem -> ../../archive/laosan.xin/chain1.pem
├── fullchain.pem -> ../../archive/laosan.xin/fullchain1.pem
├── privkey.pem -> ../../archive/laosan.xin/privkey1.pem
└── README

0 directories, 5 files

校验证书信息,输入如下命令:

1
2
3
4
5
6
7
8
9
...
Authority Information Access:
OCSP - URI:http://ocsp.int-x3.letsencrypt.org
CA Issuers - URI:http://cert.int-x3.letsencrypt.org/

X509v3 Subject Alternative Name:
DNS:*.laosan.xin
X509v3 Certificate Policies:
...

到此,我们就演示了如何在 Let’s Encrypt 申请免费的通配符证书。

证书续约

上个环节最后一步最重要事项中提示Let’s encrypt 的免费证书默认有效期为 90 天,到期后如果要非交互式续期所有证书,可以执行如下命令:

1
2
3
4
5
6
7
8
9
10
11
[root@laosanxin letsencrypt]# ./certbot-auto renew
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/laosan.xin.conf

The following certs are not due for renewal yet:
/etc/letsencrypt/live/laosan.xin/fullchain.pem expires on 2020-07-30 (skipped)
/etc/letsencrypt/live/laosan.xin/fullchain.pem expires on 2020-06-06 (skipped)
No renewals were attempted.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

nginx配置

自行百度即可

浏览器中输入地址后,证书信息如下:
zsinfo

参考资料

Let’s Encrypt 配置泛域名通用证书

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×