当证书不再安全使用时,您应该吊销它。 该情况可能由很多原因造成。 例如, 您可能意外的在某些公共网站上上传了您的私钥信息;黑客可能进入了您的服务器并复制了私钥;黑客可能暂时获取了您的服务器或 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