介绍

给域名配 HTTPS,最麻烦的往往不是申请那一刻,而是后面每 90 天一次的续期,以及"私钥到底交给谁"这件事。我在 hub.saintic.com 上加了一个 SSL 证书服务(地址 /cert),底层是内嵌的 acme + dns-lexicon,帮你自动走完 ACME 签发流程。

它最大的特点是私钥不上传:密钥对在你浏览器本地生成,hub 只收一份 CSR(证书签名请求),用 ACME 对你的公钥完成校验和签发,再把证书(fullchain)返回给你。换句话说,hub 自始至终拿不到、也不存储你的私钥——安全边界比把私钥交给某个证书平台要干净得多。

私钥是怎么被保护的

很多人担心"在线申请证书,私钥不就被服务商看到了吗"。这个服务的做法是把密钥生成这一步放到前端:

  • 浏览器用 WebCrypto + jsrsasign 在本地生成私钥,只在内存里、不上传、不落盘;
  • 据此生成 CSR(含申请域名)发给 hub;
  • hub 调 ACME 完成域名校验,对 CSR 里的公钥签发,返回 fullchain;
  • 落库的只有非敏感元数据(域名、生效/到期时间、序列号),证书和私钥都不进 hub 的库;
  • 签发成功后弹窗让你下载证书和私钥——私钥要是页面一刷新就没了(只存在那次会话内存里),所以下载完记得存好;想续期就重新提交 CSR 重新签。

这一点对"不想把私钥托付给第三方"的朋友应该挺重要。

两种校验方式

ACME 验证你拥有这个域名,有两条路:

  • DNS-01:hub 自动在你配置的 DNS 提供商上写一条 _acme-challenge 的 TXT 记录,等公网传播后 CA 来查。好处是支持通配符(*.example.com 只能用它)。用之前先在「授权凭证」里加好 DNS 提供商,支持 Cloudflare、阿里云、腾讯云(qcloud)、DNSPod 等 dns-lexicon 覆盖的厂商,凭据会加密存储、明文不入库。
  • HTTP-01:把域名的 /.well-known/acme-challenge/ 路径反向代理到本站同一路径(或让域名直接指向 hub),CA 来取校验文件时由 hub 根路径直接应答。不需要 DNS 凭据,但通配符域名只能走 DNS-01。

密钥算法支持 RSA 2048 / 3072、ECC P-256 / P-384 等(具体以下拉为准),都是前端 WebCrypto 本地生成的。

通知渠道

签发成功、失败,以及临近到期都会经你配置的通知渠道推送,不用自己记时间。支持的渠道有四种:

  • Webhook:POST 一个 {title, message} 的 JSON 到你指定的地址;
  • 飞书 / 钉钉群机器人(可选加签 secret);
  • 企业微信群机器人(key 作为 query 参数)。

到期提醒默认在证书到期前 30 / 15 / 7 天各推一次(每天 08:00 检查),基本不会漏掉续期。

大概怎么用

  1. 登录 hub.saintic.com,进 /cert;
  2. 在「授权凭证」里加 DNS 提供商(用 DNS-01 的话)和通知渠道(可选);
  3. 切到「申请证书」:填域名(每行一个,首个作 CN)、选密钥算法,点「1. 生成本地密钥并生成 CSR」;
  4. 选挑战方式(DNS-01 / HTTP-01),勾上要推送的通知渠道,点「2. 提交签发」;
  5. 等待 1–2 分钟(写 DNS 记录 + 等 CA 校验,这期间别重复提交),成功后弹窗下载证书和私钥,拿去部署即可。

当前还差什么(先说清楚)

这个服务目前聚焦"签发",有两块是明确的下一阶段 TODO,先如实交代:

  • 自动化部署:签完自动推到 Nginx / CDN / 负载均衡 / K8s Secret 这套还没做,现在是 no-op 占位,得自己下载证书去部署;
  • 吊销(revoke):也还没接 ACME revoke 接口,当前「删除」只删本地记录,证书在到期前仍然有效,要换得重新签发。

另外每用户申请限速 10 次/天(主要为了规避 CA 的速率限制),证书数量目前不设上限。

小结

如果你只是想给自己域名快速搞一张免费证书、又不想把私钥交给第三方平台,这个服务挺合适——私钥本地生成这条,安全感直接拉满。等自动部署和吊销补齐,续期就能彻底甩手了。


·End·