aboutsummaryrefslogtreecommitdiff
path: root/acme/autocert/autocert.go
diff options
context:
space:
mode:
authorSean Liao <sean@liao.dev>2025-11-09 12:22:03 +0000
committerSean Liao <sean@liao.dev>2025-11-17 10:17:16 -0800
commit2df4153a0311bdfea44376e0eb6ef2faefb0275b (patch)
tree1aa8d989964ff746611ef5341d27c02fa1cb5b1e /acme/autocert/autocert.go
parentbcf6a849efcf4702fa5172cb0998b46c3da1e989 (diff)
downloadgo-x-crypto-2df4153a0311bdfea44376e0eb6ef2faefb0275b.tar.xz
acme/autocert: let automatic renewal work with short lifetime certs
Fixes golang/go#64997 Fixes golang/go#36548 Change-Id: Idb7a426ad3bfa6ac3b796f4b466da6e3154f1ffa Reviewed-on: https://go-review.googlesource.com/c/crypto/+/719080 Reviewed-by: Roland Shoemaker <roland@golang.org> Reviewed-by: Mark Freeman <markfreeman@google.com> Reviewed-by: Daniel McCarney <daniel@binaryparadox.net> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Diffstat (limited to 'acme/autocert/autocert.go')
-rw-r--r--acme/autocert/autocert.go18
1 files changed, 6 insertions, 12 deletions
diff --git a/acme/autocert/autocert.go b/acme/autocert/autocert.go
index ccd5b7e..cde9066 100644
--- a/acme/autocert/autocert.go
+++ b/acme/autocert/autocert.go
@@ -134,7 +134,8 @@ type Manager struct {
// RenewBefore optionally specifies how early certificates should
// be renewed before they expire.
//
- // If zero, they're renewed 30 days before expiration.
+ // If zero, they're renewed at the lesser of 30 days or
+ // 1/3 of the certificate lifetime.
RenewBefore time.Duration
// Client is used to perform low-level operations, such as account registration
@@ -464,7 +465,7 @@ func (m *Manager) cert(ctx context.Context, ck certKey) (*tls.Certificate, error
leaf: cert.Leaf,
}
m.state[ck] = s
- m.startRenew(ck, s.key, s.leaf.NotAfter)
+ m.startRenew(ck, s.key, s.leaf.NotBefore, s.leaf.NotAfter)
return cert, nil
}
@@ -610,7 +611,7 @@ func (m *Manager) createCert(ctx context.Context, ck certKey) (*tls.Certificate,
}
state.cert = der
state.leaf = leaf
- m.startRenew(ck, state.key, state.leaf.NotAfter)
+ m.startRenew(ck, state.key, state.leaf.NotBefore, state.leaf.NotAfter)
return state.tlscert()
}
@@ -908,7 +909,7 @@ func httpTokenCacheKey(tokenPath string) string {
//
// The key argument is a certificate private key.
// The exp argument is the cert expiration time (NotAfter).
-func (m *Manager) startRenew(ck certKey, key crypto.Signer, exp time.Time) {
+func (m *Manager) startRenew(ck certKey, key crypto.Signer, notBefore, notAfter time.Time) {
m.renewalMu.Lock()
defer m.renewalMu.Unlock()
if m.renewal[ck] != nil {
@@ -920,7 +921,7 @@ func (m *Manager) startRenew(ck certKey, key crypto.Signer, exp time.Time) {
}
dr := &domainRenewal{m: m, ck: ck, key: key}
m.renewal[ck] = dr
- dr.start(exp)
+ dr.start(notBefore, notAfter)
}
// stopRenew stops all currently running cert renewal timers.
@@ -1028,13 +1029,6 @@ func (m *Manager) hostPolicy() HostPolicy {
return defaultHostPolicy
}
-func (m *Manager) renewBefore() time.Duration {
- if m.RenewBefore > renewJitter {
- return m.RenewBefore
- }
- return 720 * time.Hour // 30 days
-}
-
func (m *Manager) now() time.Time {
if m.nowFunc != nil {
return m.nowFunc()