letsencrypt/boulder

GitHub: letsencrypt/boulder

Boulder 是驱动 Let's Encrypt 的 ACME 证书颁发机构软件,实现了自动化的域名验证与 TLS 证书签发全流程。

Stars: 5667 | Forks: 636

# Boulder - 一个 ACME CA [![构建状态](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/ce7a764118135534.svg)](https://github.com/letsencrypt/boulder/actions/workflows/boulder-ci.yml?query=branch%3Amain) 这是一个基于 ACME 的 CA 实现。[ACME 协议](https://github.com/ietf-wg-acme/acme/) 允许 CA 自动验证证书申请人是否实际控制某个标识符,并允许订阅者为其控制的标识符颁发和撤销证书。Boulder 是运行 [Let's Encrypt](https://letsencrypt.org) 的软件。 ## 目录 * [概述](#overview) * [设置 Boulder](#setting-up-boulder) * [开发](#development) * [配合 Certbot 使用](#working-with-certbot) * [配合其他 ACME 客户端使用](#working-with-another-acme-client) * [生产环境](#production) * [贡献](#contributing) * [许可证](#license) ## 概述 Boulder 分为以下几个主要组件: 1. Web Front Ends(每个 API 版本一个) 2. Registration Authority 3. Validation Authority 4. Certificate Authority 5. Storage Authority 6. Publisher 7. CRL Updater 这种组件模型让我们能够按安全上下文分离 CA 的功能。Web Front End、Validation Authority、CRL Storer 和 Publisher 需要访问互联网,这使它们面临更高的入侵风险。Registration Authority 可以在没有互联网连接的情况下运行,但仍需与 Web Front End 和 Validation Authority 通信。Certificate Authority 只需接收来自 Registration Authority 的指令。所有组件都与 SA 通信以进行存储,因此此处未显示大多数表示 SA RPC 的连线。 ``` CA ---------> Publisher ^ | Subscriber -> WFE --> RA --> SA --> MariaDB | ^ Subscriber server <- VA <----+ | | Browser -----> S3 <----- CRL Storer/Updater ``` 在内部,系统的逻辑基于五种类型的对象:accounts(账户)、authorizations(授权)、challenges(挑战)、orders(订单)和 certificates(证书),它们直接映射到 ACME 中同名的资源。来自 ACME 客户端的请求会导致新对象的创建和现有对象的更改。Storage Authority 维护当前对象集的持久副本。 Boulder 使用 gRPC 进行组件间通信。对于希望设为远程的组件,需要为该组件实例化一个“client”(客户端)和“server”(服务器)。客户端实现组件的 Go 接口,而服务器包含组件的实际逻辑。关于此通信模型的高级概述可以在 [gRPC 文档](https://www.grpc.io/docs/) 中找到。 关于各种 ACME 操作如何在 Boulder 中发生的完整细节在 [DESIGN.md](https://github.com/letsencrypt/boulder/blob/main/docs/DESIGN.md) 中进行了说明。 ## 设置 Boulder ### 开发 Boulder 包含一个 Dockerfile 并使用 Docker Compose,以便轻松安装和设置其所有依赖项。这是维护者开发 Boulder 的方式,也是我们推荐的主要开发和实验运行方式。它不适合用作生产环境。 虽然我们致力于让 Boulder 易于设置,但 ACME 客户端开发者可能会发现 [Pebble](https://github.com/letsencrypt/pebble)(一个 Boulder 的微型版本)更适合持续集成和快速实验。 我们建议在获取 Boulder 副本之前设置 git 的 [fsckObjects 设置](https://groups.google.com/forum/#!topic/binary-transparency/f-BI4o8HZW0/discussion),以便为更新提供更好的完整性保证。 克隆 boulder 仓库: ``` git clone https://github.com/letsencrypt/boulder/ cd boulder ``` 此外,请确保已安装 Docker Engine 1.13.0+ 和 Docker Compose 1.10.0+。如果没有,可以按照 Docker 的 [安装说明](https://docs.docker.com/compose/install/) 进行操作。 我们建议 Docker 主机上至少有 **2GB 的 RAM** 可用。实际上,使用较少的 RAM 可能会导致 MariaDB 容器以不明显的方式失败。 运行我们的标准测试套件(lints、单元测试、集成测试): ``` ./t.sh ``` 运行所有单元测试: ``` ./t.sh -u ``` 运行特定的单元测试(示例为 ./va 目录): ``` ./t.sh -u -p ./va ``` 运行所有集成测试: ``` ./t.sh -i ``` 运行带覆盖率统计的单元测试和集成测试: ``` ./t.sh -ui -c --coverage-dir=./test/coverage/mytestrun ``` 运行特定的集成测试(示例运行 TestGenerateValidity 和 TestWFECORS): ``` ./t.sh -i -f TestGenerateValidity/TestWFECORS ``` 执行上述任何操作,但使用“config-next”配置(代表可能的未来状态,例如包含新功能标志): ``` ./tn.sh -your -options -here ``` 要在 Docker 容器中启动 Boulder,首先运行: ``` docker compose run bsetup ``` 这会将必要的证书写入 `test/certs/[.softhsm-tokens,ipki,webpki]`; 您只需要运行一次即可创建证书。如果需要删除所有证书并重新开始,可以删除目录 `./test/certs/.softhsm-tokens`、`./test/certs/ipki` 和 `./test/certs/webpki`,然后重新运行 `docker compose run bsetup`。 然后运行: ``` docker compose up ``` docker-compose.yml 中的配置会将您的 boulder 检出目录挂载到 /boulder,因此您可以在主机上编辑代码,更改会立即反映在使用 `docker compose` 运行的 Docker 容器内。 如果您遇到 Docker 问题,可能需要尝试[删除所有容器和卷](https://www.digitalocean.com/community/tutorials/how-to-remove-docker-images-containers-and-volumes)。 默认情况下,Boulder 使用一个假的 DNS 解析器,将所有主机名解析为 127.0.0.1。这适用于在 Docker 容器内运行集成测试。如果您希望 Boulder 能够与运行在您主机上的客户端通信,您应该使用以下命令找到主机的 Docker IP: ``` ifconfig docker0 | grep "inet addr:" | cut -d: -f2 | awk '{ print $1}' ``` 并编辑 docker-compose.yml 以更改 `FAKE_DNS` 环境变量使其匹配。这将导致 Boulder 的模拟 DNS 解析器(`sd-test-srv`)使用 `FAKE_DNS` 中的地址响应所有 A 查询。 如果您使用基于主机的防火墙(例如 `ufw` 或 `iptables`),请确保允许从 Docker 实例到您主机的所需验证端口的连接,以便您的 ACME 客户端使用。 或者,您可以使用 -e 通过环境变量覆盖 docker-compose.yml 的默认值(将 172.17.0.1 替换为上面命令中找到的主机 IPv4 地址) ``` docker compose run --use-aliases -e FAKE_DNS=172.17.0.1 --service-ports boulder ./start.py ``` 不使用 `./test.sh` 包装器运行测试: 在本地运行单元测试,不使用 docker(仅适用于某些目录): ``` go test ./issuance/... ``` 运行所有单元测试: ``` docker compose run --use-aliases boulder go test -p 1 ./... ``` 运行特定目录的单元测试: ``` docker compose run --use-aliases boulder go test ``` 运行集成测试(省略 `--filter ` 以运行所有): ``` docker compose run --use-aliases boulder python3 test/integration-test.py --chisel --gotest --filter ``` ### 配合 Certbot 使用 从 https://github.com/certbot/certbot 检出 Certbot 客户端并按照其设置说明操作。设置好客户端后,您可能希望针对本地 Boulder 运行它。针对本地 Boulder 运行客户端需要许多命令行标志,并且无需 root 权限。在本地运行客户端的最简单方法是使用一个方便的 certbot 别名(`certbot_test`)并带有一个自定义的 `SERVER` 环境变量: ``` SERVER=http://localhost:4001/directory certbot_test certonly --standalone -d test.example.com ``` 您的本地 Boulder 实例使用一个假的 DNS 解析器,该解析器对任何查询都返回 127.0.0.1,因此您可以为 -d 标志使用任何值。要返回 `127.0.0.1` 以外的答案,请将 Boulder 的 `FAKE_DNS` 环境变量更改为另一个 IP 地址。 ### 配合其他 ACME 客户端使用 按照 Boulder 开发环境说明操作并启动容器后,您会发现 ACME 端点通过以下 URL 暴露给您的主机: * ACME v2, HTTP: `http://localhost:4001/directory` * ACME v2, HTTPS: `https://localhost:4431/directory` 要访问端点的 HTTPS 版本,您需要将 ACME 客户端软件配置为使用包含 `test/certs/ipki/minica.pem` CA 证书的 CA 信任库。有关更多信息,请参阅 [`test/certs/README.md`](https://github.com/letsencrypt/boulder/blob/main/test/certs/README.md)。 您的本地 Boulder 实例使用一个假的 DNS 解析器,该解析器对任何查询都返回 127.0.0.1,允许您为任何域颁发证书,就像它解析到您的 localhost 一样。要返回 `127.0.0.1` 以外的答案,请将 Boulder 的 `FAKE_DNS` 环境变量更改为另一个 IP 地址。 大多数情况下,您会希望将 `FAKE_DNS` 配置为指向运行 ACME 客户端的主机。 ### 生产环境 Boulder 是为 Let's Encrypt 定制构建的,旨在仅支持 Web PKI 和 CA/Browser 论坛的基线要求。根据我们的经验,对于评估其用于生产环境的组织来说,Boulder 通常不是合适的选择。在大多数情况下,不需要使用 ACME 进行域授权的集中管理 PKI 是更好的选择。对于这种环境,我们建议评估 Boulder 以外的项目。 我们提供了一份简短的[部署和实施指南](https://github.com/letsencrypt/boulder/wiki/Deployment-&-Implementation-Guide),描述了在生产环境中使用 Boulder 所涉及的一些必要工作和安全注意事项。基于 docker 的 Boulder 开发环境**不适合生产使用**。它使用公开可用的私钥材料,暴露调试端口,并且对组件故障很脆弱。 虽然我们支持其他组织在生产环境中部署 Boulder,但我们优先考虑有利于 Let's Encrypt 使命的支持和开发工作。这意味着我们可能无法提供及时的支持,或者接受严重偏离我们首要目标的拉取请求。如果您已经彻底评估了替代方案并且 Boulder 确实是最合适的,我们很乐意尽我们所能回答问题。 ## 贡献 请查看 [CONTRIBUTING.md](https://github.com/letsencrypt/boulder/blob/main/docs/CONTRIBUTING.md),了解我们关于提交补丁、代码审查流程、行为准则以及与代码库相关的各种其他提示的指南。 ## 行为准则 任何以任何身份参与此社区的人员的行为准则可在[社区论坛](https://community.letsencrypt.org/guidelines)上查阅。 ## 许可证 本项目根据 Mozilla Public License 2.0 授权,其全文可在 [LICENSE.txt](https://github.com/letsencrypt/boulder/blob/main/LICENSE.txt) 文件中找到。
标签:ACME 协议, Boulder, CA, Cloudformation, EVTX分析, EVTX分析, Go 语言, HTTPS, JSONLines, Let's Encrypt, MariaDB, meg, Python工具, RA, SSL/TLS, VA, Web 安全, 信息安全, 公钥基础设施, 加密技术, 域名验证, 微服务架构, 日志审计, 自动化证书管理, 证书吊销, 证书颁发机构, 请求拦截, 软件清单, 零信任