CertMagic是什么?

CertMagic是用于Go的ACME客户端集成。

ACME的全称是Automated Certificate Management Environment,见文知意。

简单的说,使用CertMagic就能直接让你的Web Service自动实现HTTP到HTTPS的转换。

CertMagic的功能特性

按照官方文档的说明

Features

  • 全自动证书管理,包括发布和续签
  • 仅需一行,完全管理HTTPS服务器
  • 完全控制几乎系统的各个方面
  • HTTP到HTTPS的跳转(301 302)
  • 解决了ACME的所有三个提走含:HTTP,TLS-ALPN和DNS
  • 几乎解决了所有ACME客户端的鲁棒性错误处理
    • 随机化以避免意外依赖的挑战
    • 旋转以克服某些网络阻塞
    • 强大的重试长达30天
    • 仔细调谐的间隔的指数回退
    • 重试使用可选的 测试/staging CA 端点而不是生产,以避免速率限制
  • 底层由ACMEz这个主流ACME客户端驱动支持, the premier ACME client library for Go
  • 所有libdns DNS 提供者开箱即用
  • 插件化的存储实现(缺省:文件系统)
  • 通配符证书
  • 自动 OCSP 装订 (完成) 保持你的网站持续在线!
  • 所有挑战的分布式解决(工作在负载均衡之后)
    • 高效,协调的管理
    • 激活锁定
    • 智能查询
  • 支持“按需”颁发证书 (TLS 握手的时候!)
    • Caddy / CertMagic 开创了这个技术
    • 定制决策功能可调节和限制按需行为
  • 可选的用于监视的事件钩子
  • 与任何证书颁发机构(CA)的符合ACME规范的证书一起使用
  • 证书撤销 (只有当私钥被泄露的时候才需要)
  • Must-Staple (optional; not default)
  • 跨平台支持!Mac Windows Linux BSD Android…
  • 每个实例可以扩展成千上万的证书
  • 与你自己的证书一起使用

要能正常使用以上功能,需要先满足一下要求

  1. 你控制着公共DNS name
  2. 服务可公网访问
    • 或使用DNS来避免此要求
  3. 控制80(HTTP)和/或 443(HTTPS)端口
    • 或能转向你能控制的端口
    • 或使用DNS来避免这个需求
    • (这是 ACME 协议的需求, 不是库的限制)
  4. 持久存储
    • 一般是本地文件系统(缺省)
    • 其他可用的集成
  5. 在使用此库之前,你的永明必须将A/AAAA记录只想你的服务器(除非你使用了自有DNS)

CertMagic的外部依赖库

CertMagic在Golang标准库之外使用的外部依赖库

require (
    github.com/klauspost/cpuid v1.2.5
    github.com/libdns/libdns v0.1.0
    github.com/mholt/acmez v0.1.1
    github.com/miekg/dns v1.1.30
    go.uber.org/zap v1.15.0
    golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de
)

其中

代码库文件目录

排除说明性文件,版本控制文件,go mod文件和测试文件之后:

account.go acmeclient.go acmemanager.go async.go cache.go certificates.go certmagic.go config.go crypto.go dnsutil.go filestorage.go handshake.go httphandler.go maintain.go ocsp.go ratelimiter.go solvers.go storage.go