acme autocert管理器在启动时会忽略有效的证书

时间:2018-11-16 11:42:27

标签: go caching

我当前正在构建使用acme / autocert的服务。要将该服务与多个副本一起使用,我必须编写一个持久性缓存接口,例如DirCache。然后我注意到,重新启动服务后,缓存中的所有有效证书在启动时都会被忽略。以下序列始终发生:

  • 缓存放入acme_account + key(即使它存在于缓存中)
  • 缓存获取acme_account + key
  • 缓存获取my.domain.net(它返回缓存的证书)
  • 缓存获取acme_account + key
  • 将my.domain.net +令牌放入缓存
  • 缓存放HASH + http-01
  • 缓存删除HASH + http-01
  • 缓存删除my.domain.net +令牌
  • 将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
}

1 个答案:

答案 0 :(得分:3)

此问题的解决方案是缓存接口和行为正确运行。我的缓存实现有问题。我在Cache.Get(...)中有一个goroutine,它从数据库读取到通道,但是不幸的是,外部函数主体没有等待该通道,并始终返回CacheMissed错误。修复后,一切正常。我的错了