3 个版本
0.1.0-beta.2 | 2023 年 1 月 5 日 |
---|---|
0.1.0-beta.1 | 2022 年 10 月 4 日 |
0.1.0-alpha | 2021 年 12 月 2 日 |
#2326 在 命令行工具
1.5MB
511 行
介绍
有关 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 区域
- 一个指向 agnos 将运行的服务器公网 IP 地址的
A
(或AAAA
)记录。在此服务器上,UDP 端口 53(DNS 使用的端口)应打开并可用。 - 对于您希望验证的每个域,都需要为相应的
_acme-challenge
子域添加一个NS
记录,表示 agnos 应用作此特定域的域名服务器。
目录
安装
本说明针对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