我可以使用LetsEncrypt的公钥密码?

当我设置一个cronjob来每30天更新一次LetsEncrypt证书时,我可以设置公用密钥引脚吗?

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

一些谨慎的话来说:

  • 知道你在做什么,如果你打算实施HPKP。
  • 如果你做得不对,或者“如果不好的事情发生了”,这些不在你的控制之下,你可能会使你的域名无法使用。
  • 一定要用一个不重要的域来testing你的设置,或者用一个很短的caching时间来testing你的设置,例如十秒。
  • 想想哪个证书你想要钉:根,中间,叶…
  • 考虑是否有意义钉另一个(备份)证书颁发机构,它是中间证书和叶证书。
  • 比对不起更安全:考虑是否有意义把另一个备份CA /证书,有两个。
  • 如果这些要点和问题对您来说听起来是“新的”: 您执行此操作之前请先阅读HPKP的内容以及常见的陷阱和注意事项。

我可以使用LetsEncrypt的公钥密码?

  • 是。

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

  • 这取决于你指的是哪个证书,以及哪个证书是你的。

会回应gf_所说的一切。

但是,要回答这个问题,是的,你可以。

默认情况下,让我们encryption重新生成密钥和证书更新。 这使得HPKP的实施变得困难,如果您想要在叶子上进行固定,那么在中间变化的情况下( 如2016年3月所做的那样 ),您可能应该这样做。

所以,如果你仍然想要做HPKP的话,你有几个select:

  1. 使用您自己的固定CSR,而不是每次为您创buildCSR的标准客户端,因此叶子密钥不会更改。 这篇博文解释了如何做到这一点,因为作者使用HPKP。
  2. 使用短暂的HPKP到期,并在该有效期内更新,并在实际更改证书之前更改策略以使新旧密钥更新,并有足够的时间让新的策略被任何访客接收。
  3. 钉我们的encryption根而不是叶或证书。

我刚刚使用dns01validation的脱水客户端实现了这一点。 dns01挂钩是certzure,因为我们的DNS托pipe在Azure中。

编辑:当我谈论私钥时,显然我只是意味着你只把公钥部分变成了引脚。 私人钥匙,顾名思义,应始终保持私密。 查看我自己的钩子实现细节。


您需要私钥翻转来实现这一点。 也就是说,你总是有当前的私钥(称之为A)和将来的私钥(称之为B),以便你可以将它们添加到你的引脚。 所以在这一点上,你的针脚是A和B.当证书更新的日子来了,私人密钥A变得过时,B变得活着。 同时你得到一个新的未来的私钥,称之为C.你重新生成你的PIN列表,所以现在它包含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,没有匹配,当HPKP策略到期时,从第61天到第71天,客户端被指定为中指。


另一个可能更安全,更简单的select是每次使用相同的私钥,并生成一个或多个备份私钥,然后将这些私钥硬编码到HPKPconfiguration中并完成它。


是的,这是棘手的,有可能是我没有想到的警告,但我们会看到从长远来看。 很明显,我把它部署在短暂的(15天)HPKP时代的一个不加批判的子域,这样就不会造成很大的麻烦。


编辑:我已经写了几个脚本来帮助你设置HPKP让我们使用Nginx进行encryption和脱水:

HPKPinx