gpt4 book ai didi

go - crypto/autocert 包停止工作,永远挂起等待 acme 挑战

转载 作者:数据小太阳 更新时间:2023-10-29 03:18:14 24 4
gpt4 key购买 nike

我一直依赖这个库有一段时间了,没有任何问题,但突然间它完全忽略了缓存的证书,尝试获取新证书,但它只是永远等待显然永远不会出现的 acme 挑战。据我所知,我的用法是完全正确的(这在过去几周内一直有效,没有问题):

certManager := autocert.Manager{
Prompt: autocert.AcceptTOS,
HostPolicy: autocert.HostWhitelist("example.com"),
Cache: autocert.DirCache("certs"),
}

c1 := make(chan error)

go func() {
err := http.ListenAndServe(":80", certManager.HTTPHandler(nil))
if err != nil {
c1 <- err
}
}()

err := <-c1
if err != nil {
os.Stderr.WriteString(
fmt.Sprintf(
"failed to serve certification manager for acme verification - %v\n",
err,
)
)
}
if err := s.ListenAndServeTLS("", ""); err != http.ErrServerClosed {
os.Stderr.WriteString(fmt.Sprintf("Failed to start: %v\n", err))
return err
}

我在 AWS 上运行它,我 100% 确定 route53 已正确配置(它通过 http 运行)并且安全组为所有流量打开了所有端口,所以我知道这也不是问题所在。

在过去,如果挑战失败或无法加载证书,我会收到一些有用的调试信息,但没有对这个特定代码进行任何明显的更改,也没有任何有意义的错误信息,我完全陷入困境。我怎样才能调试它并得到一些有意义的解释来说明为什么这个工作代码突然失败了?有什么方法可以让我知道 letsencrypt 是否在限制我或其他什么?

最佳答案

我可以通过更改我的服务器配置来解决这个问题:

s := &http.Server{
Addr: ":https",
Handler: allowCORS(mux),
TLSConfig: &tls.Config{
GetCertificate: certManager.GetCertificate,
},
}

为此:

s := &http.Server{
Addr: ":https",
Handler: allowCORS(mux),
TLSConfig: certManager.TLSConfig(),
}

这使得通过 HTTP 进行显式服务变得多余,因此我还删除了这段代码及其错误处理:

go func() {
err := http.ListenAndServe(":http", certManager.HTTPHandler(nil))
if err != nil {
c1 <- err
}
}()

最终我的配置看起来像这样:

certManager := autocert.Manager{
Prompt: autocert.AcceptTOS,
HostPolicy: autocert.HostWhitelist("example.com"),
Cache: autocert.DirCache("certs"),
}

s := &http.Server{
Addr: ":https",
Handler: allowCORS(mux),
TLSConfig: certManager.TLSConfig(),
}

log.Fatal(s.ListenAndServeTLS("", ""))

我的 TLS 证书按预期工作

如果有人想解释为什么这是有效的,我会很乐意投票并将其标记为正确答案!

关于go - crypto/autocert 包停止工作,永远挂起等待 acme 挑战,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57842900/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com