#证书 #acme #颁发者 #自动化 #le #服务器

bin+lib certsd

CertsD - 自动化、异步的 LE 证书颁发者

9 个版本

0.6.11 2024 年 5 月 23 日
0.6.9 2023 年 5 月 15 日
0.6.1 2023 年 4 月 24 日

172异步

Download history 85/week @ 2024-05-17 41/week @ 2024-05-24 3/week @ 2024-05-31 3/week @ 2024-06-07

537 每月下载量

MIT 许可证

41KB
834

CertsD

CertsD-open - 开源、自动化、异步 LE 证书颁发者

作者

Daniel (@dmilith) Dettlaff

功能

  • 为根域名及其通配符版本生成单独的证书。

  • 使用 RON 格式的配置。

  • 支持多个 CloudFlare 账户以及一次性多个域名/区域。

  • 通过 CloudFlare API 自动管理 DNS TXT 记录。

  • 成功续期后通过 Webhook 通知 Slack。

  • 默认异步。

从配置文件读取需求

  • CloudFlare API 令牌(具有“编辑区域 DNS”权限)。

  • CloudFlare 区域 ID

  • 一个域名

工作流程详解

  • CertsD 从 现有路径之一 读取输入配置。

  • ACME 注册过程从当前工作目录开始。

  • 尝试重用所有不存在的密钥文件(account.key + example.com/domain.key + wild_example.com/domain.key)或自动生成它们。

  • 验证两个证书的到期日期(example.com/chained.pemwild_example.com/chained.pem)。默认情况下,ACME 提供有效期为 90 天的证书。基于此,CertsD 只会续期剩余有效期少于 60 天的证书。

  • ACME 流程创建 DNS 挑战。

  • 使用 CF API 创建给定域名的 DNS TXT 记录(具有挑战值)。

  • 等待 ACME 响应的订单确认。

  • 使用 CF API 删除给定域名的 DNS TXT 记录。

  • 在订单确认后,从ACME获取(example.com/chained.pem + wild_example.com/chained.pem)。

关于ACME服务的几点说明

  • CertsD的稳定性依赖于ACME服务的稳定性。不要惊慌,请耐心等待。

  • 有时ACME API会随机返回“无效”状态,原因不明。不要惊慌,请耐心等待。

  • 如果您不会频繁地删除以下之一(account.key+example.com/domain.key+wild_example.com/domain.key`),ACME可能会在没有问题的情况下更快地续订您的证书(ACME证书缓存机制)。

  • 如果您想使用ACME Staging进行测试,请将配置文件中的acme_staging: true设置为true。

软件要求

  • Rust >= 1.68.2
  • OpenSSL >= 1.1.1t

额外的构建要求

  • Clang >= 6.x
  • Make >= 3.x
  • Cmake >= 3.16
  • Perl >= 5.x
  • Patchelf > 0.17
  • POSIX兼容的基本系统(已在FreeBSD/ HardenedBSD/ Darwin和Linux系统上测试)

生产配置

注意:我将配置保存在/Services/Certsd/service.conf下,所有密钥和生成的证书在/Services/Certsd下。

(
    acme_staging: false,
    accounts: [
        (
            cloudflare_api_token: "cloudflare-api-token",
            cloudflare_zone_id: "cloudflare-zone-id",
            domain: "myexample.com",
            contacts: ["[email protected]"],
        ),

        //
    ],

    notifications: [
        Slack(webhook: "https://hooks.slack.com/services/111111111/33333333333/44444444444444444"),
        Telegram(
            chat_id: "@Public_Channel",
            token: "1111111111111111111111111111111"
        ),
        //
    ]
)

生产cron条目示例

# run certsd every 10 days, 30 minutes before midnight:
30 23 */10 * * "/Software/Certsd/exports/certsd >> /var/log/renew-example.com.log"

示例Nginx代理配置(将生成的chained.pem服务到远程主机)

server {
   listen       80;
   server_name  my.example.com;
   autoindex off;

   location ~ .*/chained.pem {
       root   /etc/certsd/certs;
   }

   location / {
       deny  all;
   }
}

依赖项

~16–29MB
~468K SLoC