@marcel91200 / caddy Mirror · read-only / commits / 17d938fc
Fork 0

Fast and extensible multi-platform HTTP/1-2-3 web server with automatic HTTPS

Mirrored from https://github.com/Slazee/caddy.git

Synced Nov 14, 05:15 UTC

httpcaddyfile: Add support for DNS challenge solvers

Configuration via the Caddyfile requires use of env variables, but an upstream issue is currently blocking that: https://github.com/go-acme/lego/issues/1054 Providers will need to be retrofitted upstream in order to support env var configuration.

Matthew Holt committed Feb 8, 2020 at 16:52 UTC 17d938fc54b347d54a4f56c1f0d6e92c65033548
3 files changed +37 -9
caddyconfig/httpcaddyfile/builtins.go
+16
@@ -98,6 +98,7 @@ func parseRoot(h Helper) ([]ConfigValue, error) {
98 // alpn <values...>
99 // load <paths...>
100 // ca <acme_ca_endpoint>
101 +// dns <provider_name>
102 // }
103 //
104 func parseTLS(h Helper) ([]ConfigValue, error) {
@@ -217,6 +218,21 @@ func parseTLS(h Helper) ([]ConfigValue, error) {
218 }
219 mgr.CA = arg[0]
220
221 + // DNS provider for ACME DNS challenge
222 + case "dns":
223 + if !h.Next() {
224 + return nil, h.ArgErr()
225 + }
226 + provName := h.Val()
227 + if mgr.Challenges == nil {
228 + mgr.Challenges = new(caddytls.ChallengesConfig)
229 + }
230 + dnsProvModule, err := caddy.GetModule("tls.dns." + provName)
231 + if err != nil {
232 + return nil, h.Errf("getting DNS provider module named '%s': %v", provName, err)
233 + }
234 + mgr.Challenges.DNSRaw = caddyconfig.JSONModuleObject(dnsProvModule.New(), "provider", provName, h.warnings)
235 +
236 default:
237 return nil, h.Errf("unknown subdirective: %s", h.Val())
238 }
caddyconfig/httpcaddyfile/httptype.go
+20 -8
@@ -71,8 +71,8 @@ func (st ServerType) Setup(originalServerBlocks []caddyfile.ServerBlock,
71 val, err = parseOptExperimentalHTTP3(disp)
72 case "storage":
73 val, err = parseOptStorage(disp)
74 - case "acme_ca":
75 - val, err = parseOptACMECA(disp)
74 + case "acme_ca", "acme_dns":
75 + val, err = parseOptACME(disp)
76 case "email":
77 val, err = parseOptEmail(disp)
78 case "admin":
@@ -222,11 +222,12 @@ func (st ServerType) Setup(originalServerBlocks []caddyfile.ServerBlock,
222 }
223 }
224 }
225 - // if global ACME CA or email were set, append a catch-all automation
225 + // if global ACME CA, DNS, or email were set, append a catch-all automation
226 // policy that ensures they will be used if no tls directive was used
227 acmeCA, hasACMECA := options["acme_ca"]
228 + acmeDNS, hasACMEDNS := options["acme_dns"]
229 email, hasEmail := options["email"]
229 - if hasACMECA || hasEmail {
230 + if hasACMECA || hasACMEDNS || hasEmail {
231 if tlsApp.Automation == nil {
232 tlsApp.Automation = new(caddytls.AutomationConfig)
233 }
@@ -236,11 +237,22 @@ func (st ServerType) Setup(originalServerBlocks []caddyfile.ServerBlock,
237 if !hasEmail {
238 email = ""
239 }
240 + mgr := caddytls.ACMEManagerMaker{
241 + CA: acmeCA.(string),
242 + Email: email.(string),
243 + }
244 + if hasACMEDNS {
245 + provName := acmeDNS.(string)
246 + dnsProvModule, err := caddy.GetModule("tls.dns." + provName)
247 + if err != nil {
248 + return nil, warnings, fmt.Errorf("getting DNS provider module named '%s': %v", provName, err)
249 + }
250 + mgr.Challenges = &caddytls.ChallengesConfig{
251 + DNSRaw: caddyconfig.JSONModuleObject(dnsProvModule.New(), "provider", provName, &warnings),
252 + }
253 + }
254 tlsApp.Automation.Policies = append(tlsApp.Automation.Policies, caddytls.AutomationPolicy{
240 - ManagementRaw: caddyconfig.JSONModuleObject(caddytls.ACMEManagerMaker{
241 - CA: acmeCA.(string),
242 - Email: email.(string),
243 - }, "module", "acme", &warnings),
255 + ManagementRaw: caddyconfig.JSONModuleObject(mgr, "module", "acme", &warnings),
256 })
257 }
258 if tlsApp.Automation != nil {
caddyconfig/httpcaddyfile/options.go
+1 -1
@@ -162,7 +162,7 @@ func parseOptStorage(d *caddyfile.Dispenser) (caddy.StorageConverter, error) {
162 return storage, nil
163 }
164
165 -func parseOptACMECA(d *caddyfile.Dispenser) (string, error) {
165 +func parseOptACME(d *caddyfile.Dispenser) (string, error) {
166 d.Next() // consume parameter name
167 if !d.Next() {
168 return "", d.ArgErr()