mirror of
				https://github.com/caddyserver/caddy.git
				synced 2025-11-04 03:27:23 -05:00 
			
		
		
		
	caddytls: Option to configure certificate lifetime (#6253)
* Add option to configure certificate lifetime * Bump CertMagic dep to latest master commit * Apply suggestions and ran go mod tidy * Update modules/caddytls/acmeissuer.go Co-authored-by: Matt Holt <mholt@users.noreply.github.com> --------- Co-authored-by: Matt Holt <mholt@users.noreply.github.com>
This commit is contained in:
		
							parent
							
								
									797973944f
								
							
						
					
					
						commit
						76c4cf5a56
					
				@ -54,6 +54,7 @@ func init() {
 | 
				
			|||||||
	RegisterGlobalOption("auto_https", parseOptAutoHTTPS)
 | 
						RegisterGlobalOption("auto_https", parseOptAutoHTTPS)
 | 
				
			||||||
	RegisterGlobalOption("servers", parseServerOptions)
 | 
						RegisterGlobalOption("servers", parseServerOptions)
 | 
				
			||||||
	RegisterGlobalOption("ocsp_stapling", parseOCSPStaplingOptions)
 | 
						RegisterGlobalOption("ocsp_stapling", parseOCSPStaplingOptions)
 | 
				
			||||||
 | 
						RegisterGlobalOption("cert_lifetime", parseOptDuration)
 | 
				
			||||||
	RegisterGlobalOption("log", parseLogOptions)
 | 
						RegisterGlobalOption("log", parseLogOptions)
 | 
				
			||||||
	RegisterGlobalOption("preferred_chains", parseOptPreferredChains)
 | 
						RegisterGlobalOption("preferred_chains", parseOptPreferredChains)
 | 
				
			||||||
	RegisterGlobalOption("persist_config", parseOptPersistConfig)
 | 
						RegisterGlobalOption("persist_config", parseOptPersistConfig)
 | 
				
			||||||
 | 
				
			|||||||
@ -456,6 +456,7 @@ func fillInGlobalACMEDefaults(issuer certmagic.Issuer, options map[string]any) e
 | 
				
			|||||||
	globalACMEDNS := options["acme_dns"]
 | 
						globalACMEDNS := options["acme_dns"]
 | 
				
			||||||
	globalACMEEAB := options["acme_eab"]
 | 
						globalACMEEAB := options["acme_eab"]
 | 
				
			||||||
	globalPreferredChains := options["preferred_chains"]
 | 
						globalPreferredChains := options["preferred_chains"]
 | 
				
			||||||
 | 
						globalCertLifetime := options["cert_lifetime"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if globalEmail != nil && acmeIssuer.Email == "" {
 | 
						if globalEmail != nil && acmeIssuer.Email == "" {
 | 
				
			||||||
		acmeIssuer.Email = globalEmail.(string)
 | 
							acmeIssuer.Email = globalEmail.(string)
 | 
				
			||||||
@ -479,6 +480,10 @@ func fillInGlobalACMEDefaults(issuer certmagic.Issuer, options map[string]any) e
 | 
				
			|||||||
	if globalPreferredChains != nil && acmeIssuer.PreferredChains == nil {
 | 
						if globalPreferredChains != nil && acmeIssuer.PreferredChains == nil {
 | 
				
			||||||
		acmeIssuer.PreferredChains = globalPreferredChains.(*caddytls.ChainPreference)
 | 
							acmeIssuer.PreferredChains = globalPreferredChains.(*caddytls.ChainPreference)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if globalCertLifetime != nil && acmeIssuer.CertificateLifetime == 0 {
 | 
				
			||||||
 | 
							acmeIssuer.CertificateLifetime = globalCertLifetime.(caddy.Duration)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										2
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								go.mod
									
									
									
									
									
								
							@ -7,7 +7,7 @@ require (
 | 
				
			|||||||
	github.com/Masterminds/sprig/v3 v3.2.3
 | 
						github.com/Masterminds/sprig/v3 v3.2.3
 | 
				
			||||||
	github.com/alecthomas/chroma/v2 v2.13.0
 | 
						github.com/alecthomas/chroma/v2 v2.13.0
 | 
				
			||||||
	github.com/aryann/difflib v0.0.0-20210328193216-ff5ff6dc229b
 | 
						github.com/aryann/difflib v0.0.0-20210328193216-ff5ff6dc229b
 | 
				
			||||||
	github.com/caddyserver/certmagic v0.20.1-0.20240412214119-167015dd6570
 | 
						github.com/caddyserver/certmagic v0.20.1-0.20240419174353-855d4670a49d
 | 
				
			||||||
	github.com/caddyserver/zerossl v0.1.2
 | 
						github.com/caddyserver/zerossl v0.1.2
 | 
				
			||||||
	github.com/dustin/go-humanize v1.0.1
 | 
						github.com/dustin/go-humanize v1.0.1
 | 
				
			||||||
	github.com/go-chi/chi/v5 v5.0.12
 | 
						github.com/go-chi/chi/v5 v5.0.12
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										4
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								go.sum
									
									
									
									
									
								
							@ -68,8 +68,8 @@ github.com/aws/smithy-go v1.19.0 h1:KWFKQV80DpP3vJrrA9sVAHQ5gc2z8i4EzrLhLlWXcBM=
 | 
				
			|||||||
github.com/aws/smithy-go v1.19.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE=
 | 
					github.com/aws/smithy-go v1.19.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE=
 | 
				
			||||||
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
 | 
					github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
 | 
				
			||||||
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
 | 
					github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
 | 
				
			||||||
github.com/caddyserver/certmagic v0.20.1-0.20240412214119-167015dd6570 h1:SsAXjoQx2wOmLl6mEwJEwh7wwys2hb/l/mhtmxA3wts=
 | 
					github.com/caddyserver/certmagic v0.20.1-0.20240419174353-855d4670a49d h1:fi1dMdHOoyWHXpxpCbaB+H4xdAgQcBP2AXSqpXVpIcg=
 | 
				
			||||||
github.com/caddyserver/certmagic v0.20.1-0.20240412214119-167015dd6570/go.mod h1:e1NhB1rF5KZnAuAX6oSyhE7sg1Ru5bWgggw5RtauhEY=
 | 
					github.com/caddyserver/certmagic v0.20.1-0.20240419174353-855d4670a49d/go.mod h1:e1NhB1rF5KZnAuAX6oSyhE7sg1Ru5bWgggw5RtauhEY=
 | 
				
			||||||
github.com/caddyserver/zerossl v0.1.2 h1:tlEu1VzWGoqcCpivs9liKAKhfpJWYJkHEMmlxRbVAxE=
 | 
					github.com/caddyserver/zerossl v0.1.2 h1:tlEu1VzWGoqcCpivs9liKAKhfpJWYJkHEMmlxRbVAxE=
 | 
				
			||||||
github.com/caddyserver/zerossl v0.1.2/go.mod h1:wtiJEHbdvunr40ZzhXlnIkOB8Xj4eKtBKizCcZitJiQ=
 | 
					github.com/caddyserver/zerossl v0.1.2/go.mod h1:wtiJEHbdvunr40ZzhXlnIkOB8Xj4eKtBKizCcZitJiQ=
 | 
				
			||||||
github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=
 | 
					github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=
 | 
				
			||||||
 | 
				
			|||||||
@ -88,6 +88,15 @@ type ACMEIssuer struct {
 | 
				
			|||||||
	// will be selected.
 | 
						// will be selected.
 | 
				
			||||||
	PreferredChains *ChainPreference `json:"preferred_chains,omitempty"`
 | 
						PreferredChains *ChainPreference `json:"preferred_chains,omitempty"`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// The validity period to ask the CA to issue a certificate for.
 | 
				
			||||||
 | 
						// Default: 0 (CA chooses lifetime).
 | 
				
			||||||
 | 
						// This value is used to compute the "notAfter" field of the ACME order;
 | 
				
			||||||
 | 
						// therefore the system must have a reasonably synchronized clock.
 | 
				
			||||||
 | 
						// NOTE: Not all CAs support this. Check with your CA's ACME
 | 
				
			||||||
 | 
						// documentation to see if this is allowed and what values may
 | 
				
			||||||
 | 
						// be used. EXPERIMENTAL: Subject to change.
 | 
				
			||||||
 | 
						CertificateLifetime caddy.Duration `json:"certificate_lifetime,omitempty"`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	rootPool *x509.CertPool
 | 
						rootPool *x509.CertPool
 | 
				
			||||||
	logger   *zap.Logger
 | 
						logger   *zap.Logger
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -178,6 +187,7 @@ func (iss *ACMEIssuer) makeIssuerTemplate() (certmagic.ACMEIssuer, error) {
 | 
				
			|||||||
		CertObtainTimeout: time.Duration(iss.ACMETimeout),
 | 
							CertObtainTimeout: time.Duration(iss.ACMETimeout),
 | 
				
			||||||
		TrustedRoots:      iss.rootPool,
 | 
							TrustedRoots:      iss.rootPool,
 | 
				
			||||||
		ExternalAccount:   iss.ExternalAccount,
 | 
							ExternalAccount:   iss.ExternalAccount,
 | 
				
			||||||
 | 
							NotAfter:          time.Duration(iss.CertificateLifetime),
 | 
				
			||||||
		Logger:            iss.logger,
 | 
							Logger:            iss.logger,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -349,6 +359,20 @@ func (iss *ACMEIssuer) UnmarshalCaddyfile(d *caddyfile.Dispenser) error {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	for d.NextBlock(0) {
 | 
						for d.NextBlock(0) {
 | 
				
			||||||
		switch d.Val() {
 | 
							switch d.Val() {
 | 
				
			||||||
 | 
							case "lifetime":
 | 
				
			||||||
 | 
								var lifetimeStr string
 | 
				
			||||||
 | 
								if !d.AllArgs(&lifetimeStr) {
 | 
				
			||||||
 | 
									return d.ArgErr()
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								lifetime, err := caddy.ParseDuration(lifetimeStr)
 | 
				
			||||||
 | 
								if err != nil {
 | 
				
			||||||
 | 
									return d.Errf("invalid lifetime %s: %v", lifetimeStr, err)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if lifetime < 0 {
 | 
				
			||||||
 | 
									return d.Errf("lifetime must be >= 0: %s", lifetime)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								iss.CertificateLifetime = caddy.Duration(lifetime)
 | 
				
			||||||
 | 
								
 | 
				
			||||||
		case "dir":
 | 
							case "dir":
 | 
				
			||||||
			if iss.CA != "" {
 | 
								if iss.CA != "" {
 | 
				
			||||||
				return d.Errf("directory is already specified: %s", iss.CA)
 | 
									return d.Errf("directory is already specified: %s", iss.CA)
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user