Skip to content

Commit c3c4a12

Browse files
authored
DNS propagation check succeeds if any configured resolver succeeds (#274)
* Changed solver DNS propagation check to only check authoritative nameservers directly if there are no explicitly given resolvers. * Changed solver DNS propagation check to only succeed of any one of the checked nameservers has the required TXT entry
1 parent 7a2236b commit c3c4a12

File tree

2 files changed

+19
-18
lines changed

2 files changed

+19
-18
lines changed

dnsutil.go

+17-17
Original file line numberDiff line numberDiff line change
@@ -210,8 +210,10 @@ func populateNameserverPorts(servers []string) {
210210
}
211211
}
212212

213-
// checkDNSPropagation checks if the expected TXT record has been propagated to all authoritative nameservers.
214-
func checkDNSPropagation(fqdn, value string, resolvers []string) (bool, error) {
213+
// checkDNSPropagation checks if the expected TXT record has been propagated.
214+
// If checkAuthoritativeServers is true, the authoritative nameservers are checked directly,
215+
// otherwise only the given resolvers are checked.
216+
func checkDNSPropagation(fqdn, value string, resolvers []string, checkAuthoritativeServers bool) (bool, error) {
215217
if !strings.HasSuffix(fqdn, ".") {
216218
fqdn += "."
217219
}
@@ -226,18 +228,22 @@ func checkDNSPropagation(fqdn, value string, resolvers []string) (bool, error) {
226228
fqdn = updateDomainWithCName(r, fqdn)
227229
}
228230

229-
authoritativeNss, err := lookupNameservers(fqdn, resolvers)
230-
if err != nil {
231-
return false, err
231+
if checkAuthoritativeServers {
232+
authoritativeServers, err := lookupNameservers(fqdn, resolvers)
233+
if err != nil {
234+
return false, err
235+
}
236+
populateNameserverPorts(authoritativeServers)
237+
resolvers = authoritativeServers
232238
}
233239

234-
return checkAuthoritativeNss(fqdn, value, authoritativeNss)
240+
return checkNameservers(fqdn, value, resolvers)
235241
}
236242

237-
// checkAuthoritativeNss queries each of the given nameservers for the expected TXT record.
238-
func checkAuthoritativeNss(fqdn, value string, nameservers []string) (bool, error) {
243+
// checkNameservers checks if any of the given nameservers has the expected TXT record.
244+
func checkNameservers(fqdn, value string, nameservers []string) (bool, error) {
239245
for _, ns := range nameservers {
240-
r, err := dnsQuery(fqdn, dns.TypeTXT, []string{net.JoinHostPort(ns, "53")}, true)
246+
r, err := dnsQuery(fqdn, dns.TypeTXT, []string{ns}, true)
241247
if err != nil {
242248
return false, err
243249
}
@@ -252,23 +258,17 @@ func checkAuthoritativeNss(fqdn, value string, nameservers []string) (bool, erro
252258
return false, fmt.Errorf("NS %s returned %s for %s", ns, dns.RcodeToString[r.Rcode], fqdn)
253259
}
254260

255-
var found bool
256261
for _, rr := range r.Answer {
257262
if txt, ok := rr.(*dns.TXT); ok {
258263
record := strings.Join(txt.Txt, "")
259264
if record == value {
260-
found = true
261-
break
265+
return true, nil
262266
}
263267
}
264268
}
265-
266-
if !found {
267-
return false, nil
268-
}
269269
}
270270

271-
return true, nil
271+
return false, nil
272272
}
273273

274274
// lookupNameservers returns the authoritative nameservers for the given fqdn.

solvers.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,7 @@ func (s *DNS01Solver) Wait(ctx context.Context, challenge acme.Challenge) error
361361
const interval = 2 * time.Second
362362

363363
// how we'll do the checks
364+
checkAuthoritativeServers := len(s.Resolvers) == 0
364365
resolvers := recursiveNameservers(s.Resolvers)
365366

366367
var err error
@@ -372,7 +373,7 @@ func (s *DNS01Solver) Wait(ctx context.Context, challenge acme.Challenge) error
372373
return ctx.Err()
373374
}
374375
var ready bool
375-
ready, err = checkDNSPropagation(dnsName, keyAuth, resolvers)
376+
ready, err = checkDNSPropagation(dnsName, keyAuth, resolvers, checkAuthoritativeServers)
376377
if err != nil {
377378
return fmt.Errorf("checking DNS propagation of %q: %w", dnsName, err)
378379
}

0 commit comments

Comments
 (0)