From c492639897ed88634f9538f70e7f1b7430b35f0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=80=97=E5=AD=90?= Date: Tue, 17 Jun 2025 09:06:05 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E6=89=8B=E5=8A=A8dns?= =?UTF-8?q?=E7=AD=BE=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/data/cert.go | 2 +- pkg/acme/client.go | 26 ++++++++++++++------------ pkg/acme/solvers.go | 10 ++++++---- 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/internal/data/cert.go b/internal/data/cert.go index d26f51d9..8f7396dd 100644 --- a/internal/data/cert.go +++ b/internal/data/cert.go @@ -326,7 +326,7 @@ func (r *certRepo) ManualDNS(id uint) ([]acme.DNSRecord, error) { return nil, err } - client.UseManualDns(len(cert.Domains)) + client.UseManualDns() records, err := client.GetDNSRecords(context.Background(), cert.Domains, acme.KeyType(cert.Type)) if err != nil { return nil, err diff --git a/pkg/acme/client.go b/pkg/acme/client.go index 4b68ad8a..19369157 100644 --- a/pkg/acme/client.go +++ b/pkg/acme/client.go @@ -35,14 +35,16 @@ func (c *Client) UseDns(dnsType DnsType, param DNSParam) { } // UseManualDns 使用手动 DNS 验证 -func (c *Client) UseManualDns(total int, check ...bool) { +func (c *Client) UseManualDns(check ...bool) { c.controlChan = make(chan struct{}) - c.dataChan = make(chan any) + c.dnsChan = make(chan any) + c.certChan = make(chan any) c.zClient.ChallengeSolvers = map[string]acmez.Solver{ acme.ChallengeTypeDNS01: &manualDNSSolver{ check: len(check) > 0 && check[0], controlChan: c.controlChan, - dataChan: c.dataChan, + dnsChan: c.dnsChan, + certChan: c.certChan, records: []DNSRecord{}, }, } @@ -84,13 +86,13 @@ func (c *Client) ObtainCertificateManual() (Certificate, error) { // 发送信号,开始验证 c.controlChan <- struct{}{} // 等待验证完成 - data := <-c.dataChan + certs := <-c.certChan - if err, ok := data.(error); ok { + if err, ok := certs.(error); ok { return Certificate{}, err } - return data.(Certificate), nil + return certs.(Certificate), nil } // RenewCertificate 续签 SSL 证书 @@ -107,22 +109,22 @@ func (c *Client) RenewCertificate(ctx context.Context, certUrl string, domains [ func (c *Client) GetDNSRecords(ctx context.Context, domains []string, keyType KeyType) ([]DNSRecord, error) { go func(ctx context.Context, domains []string, keyType KeyType) { certs, err := c.ObtainCertificate(ctx, domains, keyType) - // 将证书和错误信息发送到 dataChan + // 将证书和错误信息发送到 certChan if err != nil { - c.dataChan <- err + c.certChan <- err return } - c.dataChan <- certs + c.certChan <- certs }(ctx, domains, keyType) - // 这里要少一次循环,因为需要卡住最后一次的 dataChan,等待手动 DNS 验证完成 + // 这里要少一次循环,因为需要卡住最后一次的 dnsChan,等待手动 DNS 验证完成 for i := 1; i < len(domains); i++ { - <-c.dataChan + <-c.dnsChan c.controlChan <- struct{}{} } // 因为上面少了一次循环,所以这里接收到的即为完整的 DNS 记录切片 - data := <-c.dataChan + data := <-c.dnsChan if err, ok := data.(error); ok { return nil, err } diff --git a/pkg/acme/solvers.go b/pkg/acme/solvers.go index 7c05071e..66c26be6 100644 --- a/pkg/acme/solvers.go +++ b/pkg/acme/solvers.go @@ -267,9 +267,10 @@ type DNSProvider interface { } type manualDNSSolver struct { - check bool + check bool // 是否检查 DNS 解析,目前没写 controlChan chan struct{} - dataChan chan any + dnsChan chan any + certChan chan any records []DNSRecord } @@ -286,7 +287,7 @@ func (s *manualDNSSolver) Present(ctx context.Context, challenge acme.Challenge) Domain: domain, Value: keyAuth, }) - s.dataChan <- s.records + s.dnsChan <- s.records select { case <-s.controlChan: @@ -301,7 +302,8 @@ func (s *manualDNSSolver) CleanUp(_ context.Context, _ acme.Challenge) error { _ = recover() }() close(s.controlChan) - close(s.dataChan) + close(s.dnsChan) + close(s.certChan) return nil }