Answers:
首先请注意以下几点:
我可以在LetsEncrypt中使用公钥吗?
如果证书被更新,那么公钥也被更新,对吗?
会回应gf_所说的一切。
但是,要回答这个问题,可以。
默认情况下,“让我们加密”会在续订时重新创建密钥和证书。如果您想固定在叶子上,这会使实施HPKP变得很困难,如果发生中间更改,您可能应该这样做(就像2016年3月所做的那样)。
因此,如果您仍然想执行HPKP,则有几种解决方法:
我只是使用带有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天)的非关键子域上,这样就不会造成大麻烦。
编辑:我编写了一些脚本来帮助您使用“让我们加密”设置HPKP并使用Nginx进行脱水: