在使用 acme4j 库申请证书时,Let's Encrypt 和 ZeroSSL 存在以下主要差异,需根据实际需求选择:
1. 服务器连接与环境
| 特性 | Let's Encrypt | ZeroSSL |
|---|
| 生产服务器 URI | acme://letsencrypt.org | acme://zerossl.com |
| 测试服务器 | 提供(acme://letsencrypt.org/staging) | 不提供(截至 2024 年 2 月无官方测试环境) |
| 目录地址 | 生产:https://acme-v02.api.letsencrypt.org/directory 测试:https://acme-staging-v02.api.letsencrypt.org/directory | 固定为 https://acme.zerossl.com/v2/DV90 |
2. 账户创建要求
| 特性 | Let's Encrypt | ZeroSSL |
|---|
| 外部账户绑定(EAB) | 不需要(默认支持匿名账户) | 必须(需通过 ZeroSSL 控制台获取 EAB 凭证,如 keyIdentifier 和 hmacKey) |
| 账户验证 | 无需提前注册,通过 ACME 协议自动创建 | 需先在 ZeroSSL 平台注册账户并获取 EAB 信息,否则无法创建 ACME 账户 |
3. 证书申请流程差异
| 特性 | Let's Encrypt | ZeroSSL |
|---|
| 证书生成时间 | 通常几分钟内完成 | 可能长达 24 小时(需处理 retry-after 头部反复重试) |
| 服务器响应速度 | 较快 | 有时较慢,建议增加超时时间(如设置 networkSettings().setTimeout(Duration.ofSeconds(120))) |
| 挑战类型支持 | 全面支持 http-01、dns-01、tls-alpn-01 | 支持标准挑战类型,但需注意其服务器特性 |
| 订单查询 | 不支持 Account.getOrders()(违反 RFC8555,调用会抛 AcmeNotSupportedException) | 未知(文档未明确说明,需测试) |
4. 其他注意事项
| 特性 | Let's Encrypt | ZeroSSL |
|---|
| 库版本要求 | 无特殊要求 | 需 acme4j 3.2.0+(首个支持版本) |
| 实验性支持 | 稳定支持 | 标记为“实验性”(experimental) |
| 社区与文档 | 生态成熟,文档丰富(参考 Let's Encrypt 文档) | 文档较少,问题需提交至 acme4j 仓库而非 ZeroSSL 支持 |
代码层面的主要差异示例
ZeroSSL 需配置 EAB
// ZeroSSL 必须设置 EAB 凭证
Login login = new AccountBuilder()
.agreeToTermsOfService()
.useKeyPair(accountKeyPair)
.externalAccountBinding("keyIdentifier", "hmacKey") // 从 ZeroSSL 控制台获取
.createLogin(session);
Let's Encrypt 无需 EAB
// Let's Encrypt 直接创建账户
Login login = new AccountBuilder()
.agreeToTermsOfService()
.useKeyPair(accountKeyPair)
.createLogin(session);
超时设置(针对 ZeroSSL)
// ZeroSSL 建议延长超时时间
Session session = new Session("acme://zerossl.com");
session.networkSettings().setTimeout(Duration.ofSeconds(120)); // 设为 120 秒
总结建议
- 优先选择 Let's Encrypt:适合测试(有 staging 环境)、快速签发、无需提前注册的场景,生态成熟且稳定。
- 选择 ZeroSSL:若需其特定证书服务(如某些合规场景),需注意 EAB 配置、长时间等待及超时处理,且仅在
acme4j 3.2.0+ 中支持。