我刚开始使用 Let's Encrypt。http-01-challenge 很简单:
- 让网络服务器响应http://example.com
- 向 Let's Encrypt 询问质询文件
- 在http://example.com/.well-known/acme-challenge下提供文件
- 接收 example.com 的 TLS 证书
奇迹般有效。但是他们如何使用不安全的 http 连接确保我真的是 example.com 的所有者?
我的数据中心(或我的 ISP)中的某些管理员不能请求证书并拦截 http 请求,让我们加密发送以检查服务器的身份吗?
事实上,对于 HTTP-01 挑战,对于中间人攻击没有万无一失的保护措施。
可以拦截 Let's Encrypt 验证节点和您的服务器之间的流量的人可以通过挑战并获得颁发的证书。如果他们能够实施 BGP 诡计,他们可能甚至不一定处于正常意义上的中间。
这适用于 HTTP-01 质询,对于未签名域也适用于 DNS-01 质询。
值得注意的是,这个问题并不是 Lets Encrypt 独有的,传统 CA 对 DV 证书的验证普遍存在同样的问题;它们通常提供 HTTP、DNS 和电子邮件验证选项,所有这些都容易受到 MITM 攻击。
Let's Encrypt为缓解该问题所做的工作是从不同数据中心的多个测试节点运行每次验证,要求所有测试结果一致才能颁发证书。(我怀疑这使他们比大多数传统 CA 更不容易受到这种类型的滥用。)
这至少减少了可能处于“中间”的人的范围,因为“中间”的大部分内容会有所不同。来自不同的测试节点。
这完全是关于 Let's Encrypt(以及一般的 CA)自动域验证的默认行为,但是域所有者已经获得了一些额外的控制权,要求公共 CA 必须检查
CAA
记录。为了实际控制,域所有者可以采取以下步骤:
CAA
数据不被篡改(在 DNS-01 的情况下也保护挑战本身)
CAA
条记录以限制证书的颁发(特别
CAA
是那些不仅命名允许颁发的 CA,而且还包括允许使用该 CA 的帐户的记录)记录看起来像
CAA
这样:这个问题大大减少了,因为冒名顶替者不能一开始就轻易发起挑战。
特别注意数据中的
accounturi
参数CAA
,这是使策略特定于具有指定 CA 的域所有者帐户的原因。仅指定 CA 而不是帐户的
CAA
记录虽然有效,但帮助有限,因为这样的策略仍然允许该 CA 的任何其他客户请求颁发证书。获得 HTTP-01 挑战时使用 http 的理由在规范中:
此挑战与 ACME 协议消息不同。该规范要求 https。ACME 还对其签名消息具有完整性和重放保护。即使流量被捕获,也不仅仅是未加密的挑战。当然,它存在一些风险,但是更好的域验证程序的替代方法是什么?
监控未授权证书的更完整方法可能涉及证书透明度。在 CT 日志中搜索或设置警报以查找您的姓名。签发 CA、序列号和日期应该都很熟悉。