Let's Encrypt: ACME如何彻底简化证书获取
ACME打破了证书签发长时间没有标准化的局面。
对于每一个尝试过自行搭建一个站点的人来说,https的配置总是带有繁琐、复杂的标签:
- 需要申请一个有效的CA证书
- 反向代理的繁琐配置
- 子域名的证书申请非常麻烦
- 证书过期后需要手动替换
- ...
ACME
自动证书管理环境(英语:Automatic Certificate Management Environment,缩写ACME)是一种通信协议,用于证书颁发机构与其用户的Web服务器之间的自动化交互,允许以极低成本自动化部署公钥基础设施。该协议由互联网安全研究小组(ISRG)为Let's Encrypt服务设计。该协议通过HTTPS协议传输JSON格式的信息,并已由专门的IETF工作组在RFC 8555中规范为一个互联网标准。
在理解ACME的工作方式和提供的便利能力之前,我们需要先明确一个核心问题:
- CA签发证书的条件是,能够证明申请证书的人持有这个域名
传统的签发过程中,CA认可这个证明的方式是通过域名注册局+域名服务商来完成鉴权;由于各家域名服务商的鉴权方式、实现逻辑都有很大的不同,导致申请证书这个过程几乎只能依靠手动申请或API申请的方式。
除了上面的证明方式,我们是不是还可以有其他的方式来向证明CA我们拥有这个域名呢?如果不能直接证明,能不能够通过一些「只有域名拥有者才能造成的行为」来证明域名的持有?
ACME针对这个问题,提出了三种Challenge
(质询)的方式:
HTTP Challenge:
http challenge的证明依据在于:申请者有能力修改域名指向的地址的服务,暴露出令牌;由此可证明申请者有域名指向的地址的控制权,对证书来说和有域名的所有权等价。
DNS Challenge:
dns Challenge的证明依据在于:申请者有控制域名的DNS解析的能力,对于CA来说,即证明了域名的所有权。
TLS Challenge:
tls Challenge的证明依据在于:申请者有修改域名指向的服务器的证书的权力,即可证明申请者持有这个域名。巧妙的点在于,利用签发临时证书,来让对应站点临时拥有合法的证书,一旦完成TLS握手和证书信息校验,即可签发证书。
ACME事实上提出了一个标准,允许通过自动化的方式为不管托管在哪里的域名进行证书的签发,这样即使证书可能会出现过期的情况,自动化的程序也可以实现对即将过期的证书进行更新,从而保持证书的有效性,不再需要人为的介入。
RFC Reference: