使用letencrypt和nginx来部署多个证书

bysir · · 994 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

有一个需求是在letencrypt上申请证书并且部署到nginx.

咋一看很简单, 官方提供的certbot就能实现?

不过真实场景比较复杂, 我们还需要更多实用功能:

  1. 自动申请任何域名的ssl证书并实现多台nginx部署
  2. 自动续签证书并通知nginx reload
  3. 可并发申请证书

官方提供的hook功能有限, 而且编码复杂并不能很好的实现"自动", 所以便自行用Golang实现, 记录下思路

服务器架构

首先区分客户端和服务端, 服务端负责获取证书并通知客户端部署, 客户端负责将证书和nginx文件写入nginx目录并reload.

服务端

要做的事情有

  • 使用ACME协议向letencrypt申请证书, 并实现http01挑战, 使用的包是"github.com/xenolf/lego/acme"
  • 维持与客户端的长连接, 实现消息通知
  • 提供接口给客户端获取证书
  • 自动续签证书

注意的点

  • http01挑战需要实现acme包的Provider接口, 可以实现将key放内存来实现并发挑战. 原来的httpProviderService必须监听80端口, 而这并不是最好的.
  • 服务端会将证书存在数据库, 方便存取.
  • 长连接使用GRPC stream.

客户端

客户端负责控制nginx.

要做的事情有

  • 监听服务端发来的部署消息并执行部署逻辑
  • 写入nginx配置文件和证书文件, 并通知nginx reload
  • 转发http01挑战到服务端
  • 定时判断证书过期时间并向服务端取最新证书

额外说一下 是如果要跨容器控制nginx, 可以使用这个方案:

  • 容器挂载宿主机docker.sock, 就可以使用docker exec 控制容器中的nginx了

总体流程

  1. 服务端通过acme发起申请一个证书, 挑战方式为http01
  2. letencrypt 会请求域名, 请求会被nginx转发到客户端再转发到服务端.
  3. 服务端完成挑战接收到证书, 将证书保存到数据库并通知客户端部署.
  4. 客户端接收到证书之后将证书写入本地目录 并写入对应的nginx配置文件, 再通知nginx重启

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:bysir

查看原文:使用letencrypt和nginx来部署多个证书

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

994 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传