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()