ACME 设备认证:attezt

⭐⭐⭐⭐ 4星 | 来源: linderud.dev | 作者: Foxboron

背景

作者使用 step-ca 作为内部 ACME 服务器,为 .home.arpa 域名颁发 TLS 证书。同时也想用 SSH 证书简化 SSH 密钥设置。关键是他喜欢硬件绑定的密钥。

硬件绑定密钥的价值:即使攻击者能从系统提取签名密钥,没有硬件访问权限,这些密钥也无效。

现有工具

作者已编写两个项目:

  • age-plugin-tpm:为 age 加密软件实现 TPM 后备加密密钥
  • ssh-tpm-agent:允许 SSH 密钥由 TPM 创建并通过通用 ssh-agent 协议使用

device-attest-01 挑战

step-ca 支持新的 ACME 挑战类型 device-attest-01

  • http-01:HTTP 挑战
  • dns-01:DNS 挑战
  • device-attest-01:设备认证挑战

device-attest-01 使用 attestation(认证)和可信 CA 签名来证明设备身份。这意味着我们可以使用 TPM 创建密钥并颁发绑定到设备身份的证书。

问题:ACME 本身不做认证,依赖第三方"attestation CA"。

又一个问题:step-ca 的 device-attest-01 支持是企业版专属!

attezt 解决方案

作者编写了 attezt,为实现 device-attest-01 的 ACME 服务器提供工具支持。

工作流程

# 1. 创建 CA
attezt:~# attezt ca create

# 2. 运行服务器
attezt:~# atteztd

# 3. 注册设备(读取 TPM endorsement key 哈希)
tpm2_nvread 0x01c00002 > ekpub
openssl x509 -in ekpub -pubkey -noout | openssl pkey -pubin -outform der | sha256sum

# 4. 将设备哈希添加到清单
attezt:~# attezt ca enroll 2ea8888a4a935bfd418e6a700785655b0d2711abc52e71f1dbeeee03e9650396

# 5. 配置 smallstep ACME 服务器
step ca provisioner add acme-da \
    --type ACME \
    --challenge device-attest-01 \
    --attestation-format tpm \
    --attestation-roots ./root.pem

# 6. 颁发证书
step ca certificate \
    --attestation-uri 'tpmkms:name=device' \
    --attestation-ca-url 'https://attezt.home.arpa' \
    --provisioner acme-da framework device.crt device.tss

技术细节

  • Endorsement Key (EK):每个 TPM 都有签名的 endorsement certificate,与 EK 配对
  • Privacy preserved:EK 只能解密,不能签名,保护隐私
  • Attestation Key (AK):需要与 attestation server 往返验证
注意:设备认证在企业公钥基础设施之外实际无用。或者像作者一样,只有 2-3 台设备,希望通过短期证书而非长期证书来授予访问权限。

应用场景

  • 家庭基础设施自动化
  • TLS 证书自动更新
  • SSH 证书认证
  • 短期证书轮换

探索时间: 2026-03-22 | 标签: ACME, TPM, 设备认证, 证书, 安全