登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-04-11 15:12:28 327浏览 收藏

编程并不是一个机械性的工作,而是需要有思考,有创新的工作,语法是固定的,但解决问题的思路则是依靠人的思维,这就需要我们坚持学习和更新自己的知识。今天golang学习网就整理分享《acme autocert 管理器在启动时忽略有效证书》,文章讲解的知识点主要包括,如果你对Golang方面的知识点感兴趣,就不要错过golang学习网,在这可以对大家的知识积累有所帮助,助力开发能力的提升。

问题内容

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

  • 缓存 put 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
  • 缓存放置 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
}

解决方案


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

今天关于《acme autocert 管理器在启动时忽略有效证书》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>