#acme #letsencrypt #zero-tier

coyote

具有可编程挑战和存储的嵌入式ACME服务器

3个不稳定版本

0.1.1 2022年2月17日
0.1.0 2022年2月17日
0.0.1 2021年9月13日

#840 in 密码学


用于 ca_injector

BSD-3-Clause

220KB
5.5K SLoC

Coyote: 一个ACME工具包

Coyote 允许您创建 ACME 服务器,但无法保证它们不会在您面前爆炸。您必须自己编写代码来实现。

coyote 旨在解决一些问题(以下并非所有问题都已解决;请参阅下面的“任务列表”)

  • 通过 Rust 的存储实现特性提供您喜欢的后端存储来支持 ACME
  • 在非合规场景中提供 ACME(例如,在企业防火墙后面)
  • 提供具有对验证系统钩子的 ACME 服务,因此您可以以任何您喜欢的方式实现验证。
  • 这是一个库;您可以根据需要将其做得尽可能大或小。无需多个实现。
  • 一个开源替代方案,用于 letsencrypt 的标准实现,并且也针对 LE 的测试套件进行了测试。

acmed 是 coyote 中的示例;它是一个针对 PostgreSQL 后端存储的完整标准实现。它(故意)允许所有挑战通过,并不适用于生产使用。

coyote 的目的是让您在不使用 acmed 的前提下构建 ACME 服务,利用此库中可用的特性和工具进行脚手架搭建。例如,实现基于 Redis 的 nonce 验证系统的努力将只是一个特性实现,即使它尚未存在于本库中。

运行 acmed

acmed 是 coyote 的一个非常小的示例实现,旨在演示其使用方法。它不打算或设计用于生产环境。它无法正确执行挑战,允许所有进入的挑战通过。

您需要 docker 来启动 postgres 实例。使用 certbot 进行测试时,plain HTTP 与 certbot 一起使用效果更好,因此您无需修改 root 权限;如果您想使用 caddy 或其他 ACME 客户端,则需要使用启用 HTTPS 的服务,请参阅下面的“TLS”。

启动

$ make postgres
$ cargo run --example acmed

它将在 http://127.0.0.1:8000 上启动一个服务,然后您可以将它作为 --server 标志传递给 certbot,例如。

certbot --server 'http://127.0.0.1:8000' certonly --standalone -d 'foo.com' -m '[email protected]' --agree-tos

运行 acmed-tls

我们提供了TLS示例作为acmed-tls;只需提供HOSTNAME来设置TLS服务的域名;否则默认为localhost。在您运行cargo命令的目录中,将生成CA证书ca.pem和私钥ca.key,您需要将这些证书传递给客户端。另外,还会生成一个用于服务acmed实例的TLS内存证书。它将在https://${HOSTNAME}:8000上启动服务,您可以将它作为caddy中的acme_ca全局指令传递。

否则,使用方式相同。

访问数据库

要访问acmed运行的postgres实例(由make postgres提供)

psql -U postgres -h localhost coyote

测试

运行测试需要docker。测试在5900X处理器上大约需要70秒,大部分测试运行时间都使用了24个线程。请注意它们所需的时间,尤其是在较慢的系统上运行时。

cargo test

任务列表

JOSE/ACME协议

  • JWS解码;serde编解码器(在中间件中处理)
  • JWK转换为openssl类型;签名和验证
  • 完整的验证和非ces生成
  • ACME受保护头部的完整验证(在中间件中)
  • RFC7807 "问题细节" HTTP错误返回值
  • ACME结构体的各种验证编解码器
  • 可能:速率限制(参见RFC8555的6.6),但可能稍后
  • 将常用的第三方ACME客户端集成到测试中

处理器

  • Nonce处理器
  • Nonce中间件
  • 账户(RFC8555 7.3)
    • 处理器
      • 新账户
      • 查找账户
      • 注销
  • 订单(RFC8555 7.4)
    • 挑战特质
      • HTTP基本实现:用于certbot测试
      • 可能:DNS基本实现;请参阅下文“其他关注点”
    • 处理器
      • 授权请求
      • 获取挑战
      • 启动挑战
      • 停用挑战
      • 挑战状态
      • 最终化
      • 获取证书
      • 撤销证书
  • 其他关注点
    • 密钥更改(/key-change端点,请参阅RFC8555 7.3.5)
    • 找到一个良好的解决方案来解决DNS挑战(可能是trust-dns-client

存储

  • 数据库层
    • PostgreSQL实现
    • Nonce存储
    • 账户存储
    • 订单信息/状态机存储
    • 证书存储
      • 静态加密

Coyote目前不处理的事项

这些是我们最初目标之外的事项,我们认为它们不是更高优先级的项目。我们愿意接受此功能的拉取请求。

  • 账户
    • 服务条款变更
    • 外部账户绑定

许可证

本软件受BSD-3-Clause许可证的保护。有关详细信息,请参阅LICENSE.txt

依赖关系

~26–40MB
~746K SLoC