《Letsencrypt简单教程》一文较为详细地介绍了Letsencrypt的安装以及使用方法,然而,最近在一台服务器部署letsencrypt时,执行letsencrypt-auto命令出现错误:
./letsencrypt-auto --help all
Skipping bootstrap because certbot-auto is deprecated on this system.
Your system is not supported by certbot-auto anymore.
Certbot cannot be installed.
Please visit https://certbot.eff.org/ to check for other alternatives.
系统不再被支持!!!
查看certbot(https://github.com/certbot/certbot/releases)在
2021年1月的更新日志:
●certbot-auto was deprecated on all systems. For more information about this
change, see
Certbot-auto no longer works on Debian based systems - #7 by bmw - Help - Let's Encrypt Community Support.
可知:
certbot-auto不再支持所有的操作系统!根据作者的说法,certbot团队认为维护certbot-auto在几乎所有流行的UNIX系统以及各种环境上的正常运行是一项繁重的工作,加之certbot-auto是基于python 2编写的,而python 2即将寿终正寝,将certbot-auto迁移至python 3需要大量工作,这非常困难,因此团队决定放弃certbot-auto的维护。
既然如此,现在我们还能继续使用certbot吗?certbot团队使用了基于snap的新的分发方法。
操作系统:CentOS 7
Webserver:Nginx
2.1. 安装letsencrypt之前,需要先安装snaps。
a. 先安装epel。
yum install epel-release
b. 安装snapd。
yum install snapd
c. 启用snapd.socket。
systemctl enable --now snapd.socket
d. 创建/var/lib/snapd/snap和/snap之间的链接。
ln -s /var/lib/snapd/snap /snap
e. 退出账号并重新登录,或者重启系统,确保snap启用。
f. 安装/更新core软件包。
snap install core
snap refresh core
如果执行以上命令提示错误:
error: too early for operation, device not yet seeded or device model not acknowledged
则需要先禁用SELinux:
setenforce 0
2.2. 卸载已安装的certbot。
如果之前在系统上已经部署过certbot,则需要先将其进行卸载。
a. 卸载certbot。
yum remove certbot
b. 根据certbot安装位置删除相关文件。
rm /usr/local/bin/certbot-auto
c. 删除certbot附加软件包。
rm -rf /opt/eff.org/certbot
2.3. 安装certbot。
a. 通过snap安装certbot。
snap install --classic certbot
b. 创建/snap/bin/certbot的软链接,方便certbot命令的使用。
ln -s /snap/bin/certbot /usr/bin/certbot
3.1. 获取证书。
a. 生成证书。
确保nginx处于运行状态,需要获取证书的站点在80端口,并且可以正常访问。
certbot certonly --nginx --email xxx@mail.com -d a.do.com -d b.do.com
b. 更新nginx配置并重启nginx。
3.2. 更新证书。
certbot renew
运行certbot 相关命令时提示一下错误:
An unexpected error occurred:
ValueError: Requesting acme-v02.api.letsencrypt.org/directory: Network is unreachable
执行curl确认网络是否正常:
curl -4 -v https://acme-v02.api.letsencrypt.org/directory
curl -6 -v https://acme-v02.api.letsencrypt.org/directory
如确实无法访问,请确认防火墙设置,如防火墙设置正确,则等待一段时间后重试。出现过该站点在一段时间内在指定服务器无法访问,过一段时间后恢复正常的情况。
Letsencrypt的根证书DST Root CA X3已在2021-9-30过期,以下为在服务端通过Letsencrypt证书管理程序申请证书时生成的fullchain.pem文件中的证书链示例,需要指出的是,证书链中实际并不包含根证书,根证书由客户端从本地可信任证书存储区域中匹配补全:
[Leaf]:
subjectName: CN=dancen.com
issuerName: CN=R3,O=Let's Encrypt,C=US
notBefore: 2021/08/30_10:18:42
notAfter: 2021/11/28_10:18:41
subjectAlternativeName: [dancen.com,www.dancen.com]
[Intermediate_1/2]:
subjectName: CN=R3,O=Let's Encrypt,C=US
issuerName: CN=ISRG Root X1,O=Internet Security Research Group,C=US
notBefore: 2020/09/04_08:00:00
notAfter: 2025/09/16_00:00:00
[Intermediate_2/2]:
subjectName: CN=ISRG Root X1,O=Internet Security Research Group,C=US
issuerName: CN=DST Root CA X3,O=Digital Signature Trust Co.
notBefore: 2021/01/21_03:14:03
notAfter: 2024/10/01_02:14:03
[Root](由客户端补全):
subjectName: CN=DST Root CA X3,O=Digital Signature Trust Co.
issuerName: CN=DST Root CA X3,O=Digital Signature Trust Co.
notBefore: 2000/10/01_05:12:19
notAfter: 2021/09/30_22:01:15
对于根证书过期,Letsencrypt早在几年以前已经提供了新的名为ISRG Root X1的根证书,该证书与上面的证书链中的中间证书ISRG Root X1同名,并且使用相同的公钥,但实际为一个自签名的根证书,即证书链中的中间证书R3是由两个同名,但不同的ISRG Root X1证书交叉签名的。因此,对于终端证书,实际上存在两条可用的证书链,只不过fullchain.pem文件中明确指定的证书链为证书链1:
证书链1:guangzhuiyuan.com > R3 > ISRG Root X1(中间CA证书) > DST Root CA X3
证书链2:guangzhuiyuan.com > R3 > ISRG Root X1(根证书)
由于Letsencrypt证书管理程序在服务端生成的证书文件fullchain.pem使用的是包含过期根证书的已经失效的证书链1,因此,该证书链将无法通过客户端的验证。
幸运的是,windows、浏览器等很多客户端在建立https连接时不会直接采纳服务端提供的证书链,它们会结合本地可信任证书存储区域中的证书重新构建证书链,最终形成证书链2,不至于在建立https连接时无法通过证书验证。
然而,悲剧的是,对于Java程序等客户端,它们在与服务端建立https连接时,会直接使用服务端提供的证书链,由于证书链中根证书已经过期,https连接将无法通过证书验证。这也导致了我们在10月1日时的一些运维事故,因为一些服务器无法和另外的服务器建立https连接。
更加悲剧和不可思议的是,即便是在根证书DST Root CA X3已经过期的当下,使用Letsencrypt证书管理程序在服务端生成证书文件时,很多情况下其仍然使用了过期的根证书形成的证书链。也就是说,即使现在重新从Letsencrypt申请证书也不能解决根证书过期的问题。
解决方案1:
解决方案之一是在客户端本地的可信任证书存储区域中手动移除已过期的根证书DST Root CA X3,并且,如果客户端没有安装根证书ISRG Root X1的话,需要手动安装之,这样,客户端就能够抛弃服务端返回的证书链1,重新构建出合法的证书链2。
解决方案2:
解决方案之二是手动修正服务端fullchain.pem文件中的证书链,将其由证书链1调整为证书链2。
fullchain.pem文件中存储的证书链信息自上而下,依次对应终端证书、中间CA证书……修改证书链的方法为删除文件中的中间证书等内容,仅保留其中的终端证书,然后补上中间证书R3的内容,再强制补上根证书ISRG Root X1的内容。最终,新的fullchain.pem文件内容如下:
-----BEGIN CERTIFICATE-----
[终端证书]
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFFjCCAv6gAwIBAgIRAJErCErPDBinU/bWLiWnX1owDQYJKoZIhvcNAQELBQAw
TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMjAwOTA0MDAwMDAw
WhcNMjUwOTE1MTYwMDAwWjAyMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3Mg
RW5jcnlwdDELMAkGA1UEAxMCUjMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
AoIBAQC7AhUozPaglNMPEuyNVZLD+ILxmaZ6QoinXSaqtSu5xUyxr45r+XXIo9cP
R5QUVTVXjJ6oojkZ9YI8QqlObvU7wy7bjcCwXPNZOOftz2nwWgsbvsCUJCWH+jdx
sxPnHKzhm+/b5DtFUkWWqcFTzjTIUu61ru2P3mBw4qVUq7ZtDpelQDRrK9O8Zutm
NHz6a4uPVymZ+DAXXbpyb/uBxa3Shlg9F8fnCbvxK/eG3MHacV3URuPMrSXBiLxg
Z3Vms/EY96Jc5lP/Ooi2R6X/ExjqmAl3P51T+c8B5fWmcBcUr2Ok/5mzk53cU6cG
/kiFHaFpriV1uxPMUgP17VGhi9sVAgMBAAGjggEIMIIBBDAOBgNVHQ8BAf8EBAMC
AYYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMBMBIGA1UdEwEB/wQIMAYB
Af8CAQAwHQYDVR0OBBYEFBQusxe3WFbLrlAJQOYfr52LFMLGMB8GA1UdIwQYMBaA
FHm0WeZ7tuXkAXOACIjIGlj26ZtuMDIGCCsGAQUFBwEBBCYwJDAiBggrBgEFBQcw
AoYWaHR0cDovL3gxLmkubGVuY3Iub3JnLzAnBgNVHR8EIDAeMBygGqAYhhZodHRw
Oi8veDEuYy5sZW5jci5vcmcvMCIGA1UdIAQbMBkwCAYGZ4EMAQIBMA0GCysGAQQB
gt8TAQEBMA0GCSqGSIb3DQEBCwUAA4ICAQCFyk5HPqP3hUSFvNVneLKYY611TR6W
PTNlclQtgaDqw+34IL9fzLdwALduO/ZelN7kIJ+m74uyA+eitRY8kc607TkC53wl
ikfmZW4/RvTZ8M6UK+5UzhK8jCdLuMGYL6KvzXGRSgi3yLgjewQtCPkIVz6D2QQz
CkcheAmCJ8MqyJu5zlzyZMjAvnnAT45tRAxekrsu94sQ4egdRCnbWSDtY7kh+BIm
lJNXoB1lBMEKIq4QDUOXoRgffuDghje1WrG9ML+Hbisq/yFOGwXD9RiX8F6sw6W4
avAuvDszue5L3sz85K+EC4Y/wFVDNvZo4TYXao6Z0f+lQKc0t8DQYzk1OXVu8rp2
yJMC6alLbBfODALZvYH7n7do1AZls4I9d1P4jnkDrQoxB3UqQ9hVl3LEKQ73xF1O
yK5GhDDX8oVfGKF5u+decIsH4YaTw7mP3GFxJSqv3+0lUFJoi5Lc5da149p90Ids
hCExroL1+7mryIkXPeFM5TgO9r0rvZaBFOvV2z0gp35Z0+L4WPlbuEjN/lxPFin+
HlUjr8gRsI3qfJOQFy/9rKIJR0Y/8Omwt/8oTWgy1mdeHmmjk7j1nYsvC9JSQ6Zv
MldlTTKB3zhThV1+XWYp6rjd5JW1zbVWEkLNxE7GJThEUG3szgBVGP7pSWTUTsqX
nLRbwHOoq7hHwg==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw
TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4
WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu
ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY
MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc
h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+
0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U
A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW
T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH
B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC
B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv
KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn
OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn
jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw
qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI
rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq
hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL
ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ
3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK
NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5
ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur
TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC
jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc
oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq
4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA
mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d
emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=
-----END CERTIFICATE-----