当证书不再安全使用时,您应该吊销它。该情况可能由很多原因造成。例如, 您可能意外的在某些公共网站上上传了您的私钥信息;黑客可能进入了您的服务器并复制了私钥;黑客可能暂时获取了您的服务器或 DNS 配置的控制权,并验证、颁发了他们控制私钥的证书。
当您吊销 Let’s Encrypt 证书后,Let’s Encrypt 就可以通过证书吊销列表 (CRL) 发布吊销信息,部分浏览器会根据 CRL 决定是否信任该证书。如果私钥泄露,吊销其相应的证书不仅对于安全而言至关重要,同时也是 Let’s Encrypt 用户协议所规定的义务。
若您要吊销 Let’s Encrypt 颁发的证书,您需要通过 Certbot 之类的 ACME 客户端使用 ACME API 进行操作。您需要向 Let’s Encrypt 证明您有权吊销证书。有三种方法可以验证所有权:使用签发证书的原帐户,使用另一个授权签发的帐户,或使用证书私钥。
当吊销证书时,Let’s Encrypt用户应该选择以下原因代码:
unspecified (RFC 5280 CRLReason #0)
keyCompromise (RFC 5280 CRLReason #1)
superseded (RFC 5280 CRLReason #4)
cessationOfOperation (RFC 5280 CRLReason #5)
使用除以上外的任何原因代码的吊销请求将被拒绝。
如果最初是您自己颁发了证书,并且您仍然控制用于颁发该证书的帐户,则可以使用您的帐户凭据吊销该证书。 Certbot 将默认尝试使用该方法吊销证书。例如:
certbot revoke --cert-path /etc/letsencrypt/archive/${YOUR_DOMAIN}/cert1.pem
如果有人入侵了您的主机或 DNS 后颁发了证书,那么您一旦重新获得控制权,就会想要吊销该证书。要吊销证书,Let’s Encrypt 将需要确保您控制该证书中的域名(否则人们可以在未经许可的情况下吊销彼此的证书)!
为了验证您对该域名的控制权,您需要使用和您申请 Let’s Encrypt 证书时相同的流程:您可以添加一条 DNS TXT 记录或在HTTP 服务器上放置指定文件。通常情况下,ACME 客户端将为您处理这些工作。然而,大多数 ACME 客户端将验证控制权和颁发证书这两个操作捆绑在一起,因此若要验证控制权您必须尝试颁发新证书。若您不需要颁发的新证书,您可以将其吊销或删除证书私钥。
若您完全不想颁发一张新的证书,您可以尝试在请求中添加一个不存在的域名,这将导致证书颁发失败,但是仍旧能够证明您对需要吊销的域名的控制权。例如:
certbot certonly --manual --preferred-challenges=dns -d ${YOUR_DOMAIN} -d nonexistent.${YOUR_DOMAIN}
然后根据提示正常完成操作,但不要验证 nonexistent.${YOUR_DOMAIN} 域名。若您想要使用 HTTP 文件(而不是 DNS)来进行验证,请将 --preferred-challenges=dns 替换为 --preferred-challenges=http。需要注意的是,在通过 DNS 进行验证的情况下,如果您没有使用 --manual 选项,而是使用某些 Certbot 插件自动完成 DNS-01 验证,那么 Certbot 很有可能直接为 _acme-challenge.nonexistent.${YOUR_DOMAIN} 设置一条 TXT 记录,从而导致这种操作方法失效。
一旦您验证了要吊销的证书中所有域名的控制权,您就可以从 crt.sh 中下载证书,然后和您自己颁发了证书的情况一样,使用如下命令吊销证书:
certbot revoke --cert-path /PATH/TO/downloaded-cert.pem
如果最初不是您颁发了证书,但是您拥有相应私钥的副本,则您可以使用该私钥对吊销请求进行签名。例如,如果您发现有私钥被意外公开,即使您不是最初颁发使用该私钥的证书的人,您也可以使用此方法吊销这些证书。
若要使用此方法,您将首先需要以PEM格式复制私钥。
然后,如果您还没做,请下载要吊销的证书。 Let’s Encrypt 颁发的所有证书都会录入证书透明化日志,所以您可以在 crt.sh 等日志监视系统中查找并下载证书。搜索匹配 SubjectPublicKeyInfo (SPKI) 字段将找到使用私钥的所有证书。从私钥中提取SPKI哈希值:
openssl pkey -outform DER -in /PATH/TO/privkey.pem -pubout | openssl sha256
一旦您拥有私钥和证书,您就可以吊销该证书:
certbot revoke --cert-path /PATH/TO/cert.pem --key-path /PATH/TO/privkey.pem --reason keyCompromise