diff --git a/internal/home/dns.go b/internal/home/dns.go index cfcd74a4..579efb47 100644 --- a/internal/home/dns.go +++ b/internal/home/dns.go @@ -317,13 +317,7 @@ func newDNSTLSConfig( return &dnsforward.TLSConfig{}, nil } - cert, err := tls.X509KeyPair(conf.CertificateChainData, conf.PrivateKeyData) - if err != nil { - return nil, fmt.Errorf("parsing tls key pair: %w", err) - } - dnsConf = &dnsforward.TLSConfig{ - Cert: &cert, ServerName: conf.ServerName, StrictSNICheck: conf.StrictSNICheck, } @@ -340,6 +334,28 @@ func newDNSTLSConfig( dnsConf.QUICListenAddrs = ipsToUDPAddrs(addrs, conf.PortDNSOverQUIC) } + cert, err := tls.X509KeyPair(conf.CertificateChainData, conf.PrivateKeyData) + if err != nil { + const format = "parsing tls key pair: %w" + if conf.AllowUnencryptedDoH { + // TODO(s.chzhen): Use [slog.Logger]. + log.Info("warning: %s: %s", format, err) + + return dnsConf, nil + } + + return nil, fmt.Errorf(format, err) + } + + // Unencrypted DoH is managed by AdGuard Home itself, not by dnsproxy. + // Therefore, avoid setting the certificate property to prevent dnsproxy + // from starting encrypted listeners. See [dnsforward.Server.prepareTLS]. + if conf.AllowUnencryptedDoH { + return dnsConf, nil + } + + dnsConf.Cert = &cert + return dnsConf, nil }