我可以将 Public-Key-Pins 与 LetsEncrypt 一起使用吗?

我可以将 Public-Key-Pins 与 LetsEncrypt 一起使用吗?

当我设置 cronjob 以每 30 天更新一次 LetsEncrypt 证书时,我可以设置 Public-Key-Pins 吗?

如果证书更新了,那么公钥密码也会更新,对吗?

答案1

首先要提醒大家的是:

  • 如果您计划实施 HPKP,请了解您在做什么。
  • 如果您做得不正确,或者“如果发生了不好的事情”,而这些事情不在您的控制范围内,则可能会导致您的域名无法使用。
  • 请务必使用不太重要的域名或非常短的缓存时间(例如十秒)来测试您的设置。
  • 想想您想要固定哪些证书:根证书、中间证书、叶证书……
  • 考虑一下固定另一个(备份)证书颁发机构、中间证书和叶证书是否有意义。
  • 安全总比后悔好:考虑是否有必要再固定一个备份 CA/证书,最好有两个。
  • 如果这些观点和问题对你来说听起来很“新”:请阅读 HPKP 的内容以及常见的陷阱和注意事项,你实现了这个。

我可以将 Public-Key-Pins 与 LetsEncrypt 一起使用吗?

  • 是的。

如果证书更新了,那么公钥密码也会更新,对吗?

  • 这取决于您引用的是哪个证书以及您要固定哪个证书。

答案2

会重复 gf_ 所说的一切。

然而,回答这个问题,是的,你可以。

默认情况下,Let's Encrypt 会在续订时重新创建密钥和证书。如果您想在叶子上进行固定,这会使实施 HPKP 变得困难,您可能应该这样做,以防中间发生更改(就像 2016 年 3 月那样)。

因此,如果你仍然想进行 HPKP,那么你有几个选择:

  1. 使用您自己的固定 CSR,而不是每次为您创建 CSR 的标准客户端,这样叶密钥就不会改变。这篇博文具体解释了如何做到这一点,因为作者使用了HPKP。
  2. 使用较短的 HPKP 有效期,并在有效期内进行更新,并在实际更改证书之前更改策略以同时拥有新旧密钥,并有足够的时间让任何访问者掌握新策略。
  3. 固定 Let's Encrypt 根而不是叶或证书。

答案3

我刚刚使用脱水客户端使用 dns01 验证。dns01 钩子是认证因为我们的 DNS 托管在 Azure 中。

编辑:当我谈论私钥时,显然我总是指你只把公钥部分变成密码。顾名思义,私钥应该总是保持私密。请参阅我自己的钩子以了解实现细节。


您需要私钥滚动才能实现这一点。也就是说,您始终拥有当前私钥(称为 A)和未来手头有私钥(称为 B),这样您就可以将它们都添加到您的密码中。因此,此时您的密码是 A 和 B。当证书续订日到来时,私钥 A 变为过时,而 B 变为有效。同时,您会获得一个新的未来私钥,称为 C。您重新生成密码列表,因此现在它包含 B 和 C。这就是您转移私钥的方式。脱水现在支持这个

此外,你需要一个钩子,每次你更新证书并转移私钥时都会调用它。我实现了这个我自己

最后,如果我理解正确的话,你必须确保:

HPKP age x 2 < days between cert renewals

例如,如果您的 HPKP 年龄为 50 天,并且您每 30 天更新一次证书,那么第一天访问您网站的客户端将只能使用私钥 A 和 B,而您在第 31 天将其转移到 B 和 C。您的服务器有 B 和 C,客户端有 A 和 B,即使在第 50 天也匹配,并且客户端可以正确打开网站。

但是让我们看看 HPKP 的期限是否为 70 天。您每 30 天更新一次证书,并且客户端在第一天访问了您的网站,因此,它再次只拥有私钥 A 和 B。您在第 31 天转向 B 和 C,在第 61 天转向 C 和 D。您的服务器有 C 和 D,客户端有 A 和 B,没有匹配,并且客户端从第 61 天到第 71 天(其 HPKP 策略到期)被竖中指。


另一个可能更安全且肯定更简单的选择是每次使用相同的私钥并生成一个或多个备份私钥,然后将它们硬编码到您的 HPKP 配置中并完成它。


是的,这很棘手,可能存在一些我没有想到的警告,但从长远来看,我们会看到。显然,我将其部署在一个 HPKP 年龄较短(15 天)的非关键子域上,这样就不会造成大麻烦。


编辑:我编写了一些脚本来帮助您使用 Let's Encrypt 设置 HPKP 并使用 Nginx 进行脱水:

HPKPinx

相关内容