#证书 #DNS #加密 #SSL证书 #TLS证书 #DNS查询 #let

app agnos

使用 DNS-01 获取来自 Let's Encrypt 的(通配符)证书,无需访问 DNS 提供商的 API

3 个版本

0.1.0-beta.22023 年 1 月 5 日
0.1.0-beta.12022 年 10 月 4 日
0.1.0-alpha2021 年 12 月 2 日

#2326命令行工具

MIT 许可协议

1.5MB
511

Crates.io badge github release badge badge github downloads badge
drawing
This project is proudly sponsored by Red Iron, the Rust division of OCamlPro

介绍

有关 ACME 协议及其 DNS 验证部分的介绍,您可以参考我们的 beta 版本 博客文章

Agnos 是一个单二进制程序,允许您轻松地从 Let's Encrypt 获取证书(包括通配符),使用 DNS-01 挑战。它自行回答 Let's Encrypt 的 DNS 查询,绕过对您的 DNS 提供商 API 调用的需求。

为什么

Let's Encrypt 文档中对 DNS-01 的总结如下

优点

  • 您可以使用此挑战来颁发包含通配符域名的证书。
  • 即使您有多个 Web 服务器,它也能很好地工作。

缺点

  • 在您的 Web 服务器上保留 API 凭证是危险的。
  • 您的 DNS 提供商可能不提供 API。
  • 您的 DNS API 可能不提供有关传播时间的信息。

通过提供自己的 DNS 答案,agnos

  • 消除了对 API 和 API 凭证的需求
  • 消除了所有关于传播时间的担忧

因此,agnos 几乎消除了所有 DNS-01 挑战的缺点

如何

Agnos 利用 Let's Encrypt 功能来跟踪 DNS NS 记录。它需要您将以下内容添加到您的 DNS 区域

  1. 一个指向 agnos 将运行的服务器公网 IP 地址的 A(或 AAAA)记录。在此服务器上,UDP 端口 53(DNS 使用的端口)应打开并可用。
  2. 对于您希望验证的每个域,都需要为相应的 _acme-challenge 子域添加一个 NS 记录,表示 agnos 应用作此特定域的域名服务器。

目录

  1. 安装
    1. 发布的二进制文件
    2. AUR 软件包
    3. 构建
    4. 设置权限,以便不以 root 身份运行 agnos
  2. 用法
    1. Let's Encrypt 账户
    2. Agnos 配置
      1. 通用
      2. 账户
      3. 证书
    3. 配置您的 DNS 提供商
    4. 运行 agnos
  3. 开发者

安装

本说明针对Linux系统,但类似的流程可能在所有Unix系统上以及Windows系统上也能工作。

发布的二进制文件

对于(相对较新)的Linux/amd64,每个标记的版本都提供了预编译的二进制文件。

AUR 软件包

Agnos可在AUR中找到。您可以使用以下命令安装它:yay -S agnos

构建

Agnos是用Rust编写的。要构建它,您需要安装Rust工具链。

一旦您获得了源代码,以下命令将构建二进制文件并将其放在仓库的根目录下。

cd agnos/
cargo build --release
mv target/release/agnos agnos

设置权限,以便不以 root 身份运行 agnos

因为agnos监听的是低序号端口53,所以它需要特殊权限。作为root运行是可以的,但如果您(可以理解)不想这样做,下面的命令是给您准备的

# as root
setcap 'cap_net_bind_service=+ep' agnos
# agnos is the file of the binary as compiled above

用法

Let's Encrypt 账户

Let's Encrypt账户通过电子邮件地址和私有的RSA密钥来识别。要生成此类密钥,请使用以下命令

openssl genrsa 2048 > /path/to/store/the/key.pem

或者如果您更喜欢更大的密钥

openssl genrsa 4096 > /path/to/store/the/key.pem

Agnos 配置

Agnos通过单个TOML文件进行配置。一个带注释的示例可以在config_example.toml中找到。

建议在配置文件中使用绝对路径而不是相对路径。

配置中有三个“级别”

1. 通用

通用配置级别是提供要监听的IP地址的地方。

dns_listen_adr = "1.2.3.4:53"

2. 账户

可以指定多个Let's Encrypt账户。对于每个账户,必须提供电子邮件地址和账户RSA私钥的路径。

[[accounts]]
email= "[email protected]"
private_key_path = "priv_key.pem"

3. 证书

对于每个账户,可以订购多个证书。每个证书可以覆盖多个域名。在磁盘上,证书由两个文件表示:完整的证书链和证书的私钥(由agnos生成,与账户私钥不同)。

[[accounts.certificates]]
domains =  ["doma.in","*.doma.in"]
fullchain_output_file = "fullchain_A.pem"
key_output_file = "cert_key_A.pem"

配置您的 DNS 提供商

假设我们有以下我们想要获取证书(或多个证书)的域名

  • doma.in
  • 及其通配符变体:*.doma.in(对于doma.in及其通配符)
  • examp.le
  • another.examp.le

请注意,我们不是请求*.examp.le的证书,而是仅请求一个子域的证书:another.examp.le

Let's Encrypt DNS-01挑战将会要求在以下三个域名上提供TXT DNS记录

  • _acme-challenge.doma.in(对于doma.in及其通配符)
  • _acme-challenge.examp.le
  • _acme-challenge.another.examp.le

假设agnos将在一个服务器的公共IP地址上运行,该IP地址为1.2.3.4。目标是表明上面提到的三个_acme_challenge域名由agnos通过NS DNS记录管理。NS记录通常指向域名,因此我们还将为agnos-ns.doma.in设置一个A记录,使其指向1.2.3.4(这里agnos-ns.doma.in完全是任意的,它可以是另一个完全独立的域名,由你控制,例如my-agnos.com)。

我们创建以下记录

doma.in区域

agnos-ns.doma.in            A       1.2.3.4
_acme-challenge.doma.in     NS      agnos-ns.doma.in

examp.le区域

_acme-challenge.examp.le            NS      agnos-ns.doma.in
_acme-challenge.another.examp.le    NS      agnos-ns.doma.in

注意:尽管这可能看起来很麻烦,但您只需在您的DNS提供商的Web界面上执行一次。完成之后,您将永远不需要触摸任何TXT记录。

运行 agnos

agnos接受一个命令行参数,即配置文件的路径,以及两个可选标志:--no-staging用于使用Let's Encrypt生产服务器,以及--debug用于显示更多调试信息。通过agnos --help可以获得帮助。

运行时,它会检查全链证书是否将在接下来的30天内到期,只有在那种情况下才会续订,因此它适合在cron作业中使用。

开发者

非常欢迎PR和问题。

使用常规的cargo命令构建。

Makefile用于在docker compose中集成测试。在根目录下,运行sudo make(sudo是使用docker所必需的)以使用pebble测试agnos。

依赖项

~21–35MB
~563K SLoC