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

时间:2019-09-08 14:37:02

标签: go lets-encrypt

我一直依赖这个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是否正在限制我或其他事情?

1 个答案:

答案 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证书按预期工作

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