|
6 | 6 | "fmt"
|
7 | 7 | "io/ioutil"
|
8 | 8 | fmtlog "log"
|
| 9 | + "net" |
9 | 10 | "net/url"
|
10 | 11 | "reflect"
|
11 | 12 | "strings"
|
@@ -74,10 +75,12 @@ type Certificate struct {
|
74 | 75 |
|
75 | 76 | // DNSChallenge contains DNS challenge Configuration
|
76 | 77 | type DNSChallenge struct {
|
77 |
| - Provider string `description:"Use a DNS-01 based challenge provider rather than HTTPS."` |
78 |
| - DelayBeforeCheck flaeg.Duration `description:"Assume DNS propagates after a delay in seconds rather than finding and querying nameservers."` |
79 |
| - preCheckTimeout time.Duration |
80 |
| - preCheckInterval time.Duration |
| 78 | + Provider string `description:"Use a DNS-01 based challenge provider rather than HTTPS."` |
| 79 | + DelayBeforeCheck flaeg.Duration `description:"Assume DNS propagates after a delay in seconds rather than finding and querying nameservers."` |
| 80 | + Resolvers types.DNSResolvers `description:"Use following DNS servers to resolve the FQDN authority."` |
| 81 | + DisablePropagationCheck bool `description:"Disable the DNS propagation checks before notifying ACME that the DNS challenge is ready. [not recommended]"` |
| 82 | + preCheckTimeout time.Duration |
| 83 | + preCheckInterval time.Duration |
81 | 84 | }
|
82 | 85 |
|
83 | 86 | // HTTPChallenge contains HTTP challenge Configuration
|
@@ -252,6 +255,9 @@ func (p *Provider) getClient() (*acme.Client, error) {
|
252 | 255 | if p.DNSChallenge != nil && len(p.DNSChallenge.Provider) > 0 {
|
253 | 256 | log.Debugf("Using DNS Challenge provider: %s", p.DNSChallenge.Provider)
|
254 | 257 |
|
| 258 | + SetRecursiveNameServers(p.DNSChallenge.Resolvers) |
| 259 | + SetPropagationCheck(p.DNSChallenge.DisablePropagationCheck) |
| 260 | + |
255 | 261 | err = dnsOverrideDelay(p.DNSChallenge.DelayBeforeCheck)
|
256 | 262 | if err != nil {
|
257 | 263 | return nil, err
|
@@ -784,3 +790,37 @@ func isDomainAlreadyChecked(domainToCheck string, existentDomains []string) bool
|
784 | 790 | }
|
785 | 791 | return false
|
786 | 792 | }
|
| 793 | + |
| 794 | +// SetPropagationCheck to disable the Lego PreCheck. |
| 795 | +func SetPropagationCheck(disable bool) { |
| 796 | + if disable { |
| 797 | + acme.PreCheckDNS = func(_, _ string) (bool, error) { |
| 798 | + return true, nil |
| 799 | + } |
| 800 | + } |
| 801 | +} |
| 802 | + |
| 803 | +// SetRecursiveNameServers to provide a custom DNS resolver. |
| 804 | +func SetRecursiveNameServers(dnsResolvers []string) { |
| 805 | + resolvers := normaliseDNSResolvers(dnsResolvers) |
| 806 | + if len(resolvers) > 0 { |
| 807 | + acme.RecursiveNameservers = resolvers |
| 808 | + log.Infof("Validating FQDN authority with DNS using %+v", resolvers) |
| 809 | + } |
| 810 | +} |
| 811 | + |
| 812 | +// ensure all servers have a port number |
| 813 | +func normaliseDNSResolvers(dnsResolvers []string) []string { |
| 814 | + var normalisedResolvers []string |
| 815 | + for _, server := range dnsResolvers { |
| 816 | + srv := strings.TrimSpace(server) |
| 817 | + if len(srv) > 0 { |
| 818 | + if host, port, err := net.SplitHostPort(srv); err != nil { |
| 819 | + normalisedResolvers = append(normalisedResolvers, net.JoinHostPort(srv, "53")) |
| 820 | + } else { |
| 821 | + normalisedResolvers = append(normalisedResolvers, net.JoinHostPort(host, port)) |
| 822 | + } |
| 823 | + } |
| 824 | + } |
| 825 | + return normalisedResolvers |
| 826 | +} |
0 commit comments