我一直依赖这个lib一段时间,没有任何问题,但是突然间,它完全忽略了缓存的证书,尝试获取新证书,但是它只是永远地等待着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运行),并且安全组已为所有流量打开了所有端口,因此我也不是问题所在。
过去,如果挑战失败或无法加载证书,我会收到一些有用的调试信息,但是对于此特定代码没有任何明显的更改,也没有任何有意义的错误信息,我完全陷入了困境。如何调试此代码并获得一些有意义的解释,以说明为什么此工作代码突然失败了?有没有办法知道letencrypt是否正在限制我或其他事情?
答案 0 :(得分:0)
我可以通过以下更改服务器配置来解决此问题:
import collections
Card = collections.namedtuple("Card", ("rank", "suit"))
class FrenchDeck:
ranks = [str(n) for n in range(2, 11)] + list("JQKA")
suits = "spades diamonds clubs hearts".split()
def __init__(self):
self._cards = [Card(rank, suit) for suit in self.suits for rank in self.ranks]
对此:
s := &http.Server{
Addr: ":https",
Handler: allowCORS(mux),
TLSConfig: &tls.Config{
GetCertificate: certManager.GetCertificate,
},
}
这使得通过HTTP显式提供服务变得多余,因此我也删除了此代码及其错误处理:
s := &http.Server{
Addr: ":https",
Handler: allowCORS(mux),
TLSConfig: certManager.TLSConfig(),
}
最终,我的配置看起来像这样:
go func() {
err := http.ListenAndServe(":http", certManager.HTTPHandler(nil))
if err != nil {
c1 <- err
}
}()
我的TLS证书按预期工作
如果有人想要解释为什么可行,我会很乐意投票并将其标记为正确答案!