go x/crypto/acme/autocert:处理证书生命周期短的问题

bprjcwpo  于 3个月前  发布在  Go
关注(0)|答案(9)|浏览(46)

Go版本
暂无(x/crypto v0.17.0,撰写本文时最新)

go env 在你的模块/工作区中的输出:

n/a

你做了什么?

使用autocert与step-ca作为ACME服务器(https://smallstep.com/docs/step-ca/)进行内部测试。我创建了一个指向step-ca的acme.Client,但我没有更改autocert.Manager.RenewBefore。

你看到了什么?

Autocert检索到了证书,所以它按预期工作。
然而,autocert立即启动并不断刷新证书。这是因为默认的RenewBefore是30天,这对于Let's Encrypt的90天证书有效期期是合理的。然而,step-ca颁发有效期为1天的短暂证书。因此,当检索到新证书时,它会立即刷新,无限循环。

你期望看到什么?

没有刷新循环。
当然,我应该将autocert.Manager.RenewBefore设置为与新step-ca示例的默认1天证书有效期相匹配。这将防止这个问题。然而,我在应用程序中没有使RenewBefore可配置,所以相反,我将step-ca配置更改为颁发有效期为31天的证书。我认为将来配置其他ACME提供商时,更多人可能会遇到这个问题。
我认为改变零RenewBefore值的行为是有帮助的。我们可以将续订时间设置为证书有效期的2/3。对于Let's Encrypt,这仍然是到期前的30天。对于有效期为1天的证书,它将在到期前8小时续订。如果证书有效期为12个月,它将在到期前的4个月续订(这可能感觉太早,但无害,而且不太可能:ACME的一个优点是启用更短寿命的证书,由于吊销问题而令人向往)。
至少,我们应该在不立即续订已签发证书的情况下添加一个检查。例如,有一个最小的“下次刷新延迟”,如1小时。
如果对此想法有兴趣,我可以发起一个CL。

oewdyzsn

oewdyzsn1#

CC @bradfitz, @rolandshoemaker, @golang/security。

1cosmwyk

1cosmwyk2#

Let's Encrypt将来也会开始提供短期证书作为选项,例如7天证书。
我们被这个包用作默认的CA。
当前的行为对我们来说是有问题的,所以在做任何事情之前提前改变这个会很好,使过渡更容易,避免需要阻止不守规矩的客户端。
我建议使用2/3分数而不是30天。

v6ylcynt

v6ylcynt3#

由于这实际上将是一个API更改,因此应该通过提案过程进行。
听起来一个合理的更改是使RevewBefore的文档注解为:

// RenewBefore optionally specifies how early certificates should
// be renewed before they expire.
//
// If zero, they're renewed the lesser of 30 days before expiration,
// or after 2/3 of the certificate lifetime (i.e. for a certificate
// with a 9 day validity period, 3 days before expiration).
RenewBefore time.Duration

这保持了当前对于非常长时间存在的证书的行为(不太可能特别常见,但🤷),同时引入了更理想的行为对于较短寿命的证书。

zynd9foi

zynd9foi4#

我相信现在有一些WebPKI CA正在通过ACME颁发一年期证书,可能还有一些私有的,所以在这里包含一个"较小者"的条款对我来说是有意义的。

yduiuuwa

yduiuuwa5#

根据以上讨论,此建议似乎是一个可能接受的建议。
— rsc for the proposal review group
该建议编号为#64997(评论)。

zwghvu4y

zwghvu4y6#

共识没有变化,所以接受。🎉
此问题现在跟踪实施提案的工作。
— rsc提案审查组
提案编号为#64997(评论)。

db2dz4w8

db2dz4w87#

是否有人已经计划对此进行工作?如果没有,我可以尝试一下。

wgmfuz8q

wgmfuz8q8#

我不太可能在短时间内完成这个任务,如果你愿意提交一个CL(Change List)请求,我很乐意进行审查。

5ktev3wc

5ktev3wc9#

https://go.dev/cl/579695提到了这个问题:acme/autocert: renew certs at 2/3 of lifetime by default, but not earlier than 30d before expiry

相关问题