go - acme autocert 管理器在启动时忽略有效证书

标签 go caching

我目前正在构建一个使用 acme/autocert 的服务。要将该服务用于超过 1 个副本,我必须编写一个持久缓存接口(interface),如 DirCache。然后我注意到,在重新启动服务后,缓存中的所有有效证书在启动时都被忽略了。以下顺序始终发生:

  • 缓存放acme_account+key(即使存在缓存中)
  • 缓存获取acme_account+key
  • 缓存获取 my.domain.net(它返回缓存的证书)
  • 缓存获取acme_account+key
  • 缓存放my.domain.net+token
  • 缓存放HASH+http-01
  • 缓存删除HASH+http-01
  • 缓存删除my.domain.net+token
  • Cache put my.domain.net(放入新证书)

这是正确的行为吗?因为每个副本都会创建自己的证书,并且在这种情况下不可能有持久缓存

这是我的经理工厂

func NewManager(d *db.DynamoDB, staging bool) *Manager {
    manager := &Manager{
        CertCache: NewPersistentCertCache(d),
    }

    directoryURL := acme.LetsEncryptURL
    if staging {
        directoryURL = LetsEncryptStagingURL
        log.Infof("Using CA staging environment")
    }
    log.Infof("CA URI %s", directoryURL)

    client := &acme.Client{
        DirectoryURL: directoryURL,
    }

    manager.AcmeManager = &autocert.Manager{
        Prompt:     autocert.AcceptTOS,
        HostPolicy: manager.AllowHostPolicy,
        Cache:      manager.CertCache,
        Client:     client,
    }

    return manager
}

最佳答案

这个问题的解决方案是缓存接口(interface)和行为正常工作。我的缓存实现有问题。我在 Cache.Get(...) 中有一个从数据库读取到 channel 的 goroutine,但不幸的是,外部 func 主体没有等待该 channel 并始终返回 CacheMissed 错误。修复后一切正常。我的错对不起

关于go - acme autocert 管理器在启动时忽略有效证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53337190/

相关文章:

javascript - 停止从缓存中加载 Javascript 和 HTML

caching - Windows Azure 是否具有 Web 缓存功能?

mysql - sql缓存的缺点?

php - 使用 PHP 输出 CSS、javascript 和图像

c++ - 是否有一个示例如何使用 SWIG 通过 go build 生成 C++ 建筑?

go - 美化丑陋的三个嵌套循环

go - XML 解码不遵守根元素 namespace 前缀定义

go - 将接口(interface)方法的参数限制为一些允许的结构?

amazon-web-services - 无法将消息从 lambda 发送到 aws sqs,并且 aws-sdk 没有返回任何错误

javascript - 如何在用户不访问该页面的情况下将项目添加到 Chrome 缓存?