我已经依赖这个库有一段时间了,没有任何问题,但是突然它完全忽略了缓存的证书,试图获得一个新的证书,但它只是永远等待着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
}我在亚马逊网络服务上运行这个程序,我100%确定route53配置正确(它在http上工作),并且安全组为所有流量打开了所有端口,所以我知道这也不是问题所在。
在过去,如果质询失败或证书无法加载,我会收到一些有用的调试信息,但如果没有对此特定代码的任何明显更改和任何有意义的错误信息,我就完全卡住了。我如何调试它,并得到一些有意义的解释,为什么这个工作的代码突然失败了?有没有办法让我知道letsencrypt对我有什么影响?
发布于 2019-09-08 23:30:24
我能够通过将我的服务器配置从以下位置更改来解决此问题:
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证书可以正常工作
如果有人想解释为什么这是可行的,我会很高兴地把它标记为正确的答案!
https://stackoverflow.com/questions/57842900
复制相似问题