使用 EJBCA 社区版,在双层 PKI 层级结构中动手实现 NIST FIPS 204 (ML-DSA)。
一个完整的纯 PQC PKI 层级结构,跨两台独立的虚拟机运行,每台虚拟机都有自己的 EJBCA 容器:
VM 1 — Root CA
└─ ML-DSA-65 self-signed Root CA
└─ CRL published and reachable
VM 2 — Sub CA
└─ ML-DSA-65 Sub CA signed by Root CA
└─ CRL published and reachable
└─ OCSP responder active
证书链中的每一份证书(根 CA、子 CA)均仅使用 ML-DSA-65 (NIST FIPS 204) 签名。无 RSA。无 ECDSA。端到端纯 PQC。
ML-DSA(前身为 CRYSTALS-Dilithium)是 FIPS 204 下经 NIST 标准化的后量子数字签名算法。本实验室选用 Dilithium3 参数集(ML-DSA-65)——它提供 128 位后量子安全性,是大多数部署场景下推荐的全用途选项。
ejbca-pqc-lab/
├── README.md
├── root-ca/
│ └── setup-lab.sh # Run on VM1 — sets up the Root CA machine
└── sub-ca/
└── setup-lab.sh # Run on VM2 — sets up the Sub CA machine
chmod +x setup-lab.sh
sudo ./setup-lab.sh
完成后,通过以下地址访问管理界面(Admin UI):
https://<VM1_IP>:8443/ejbca/adminweb/
将容器中的 superadmin.p12 导入浏览器:
docker cp ejbca:/opt/ejbca/p12/superadmin.p12 ~/superadmin.p12
默认密码:ejbca
然后按照 Medium 文章手动配置根 CA。
chmod +x setup-lab.sh
sudo ./setup-lab.sh
完成后,通过以下地址访问管理界面(Admin UI):
https://<VM2_IP>:8443/ejbca/adminweb/
以同样方式导入 superadmin.p12,然后按照 Medium 文章配置子 CA。
ejbca-data 卷docker-compose.yml所有 EJBCA 配置均通过管理界面(Admin UI)手动完成——证书配置文件、加密令牌、CA 创建、CRL 设置和 OCSP。这是有意为之。脚本负责让平台运行起来,而 Medium 文章记录了每一项手动决策及其原因。
| 组件 | CA | 状态 |
|---|
ACME — ACME 协议(RFC 8555)不支持使用 ML-DSA 进行账户密钥认证,仅允许 RSA 和 ECDSA。若加入 ACME,则需要经典账户密钥,从而破坏纯 PQC 设定。IETF 正在制定 PQC ACME 草案,待其定稿后本实验室将进行更新。
浏览器信任 — 目前尚无主流浏览器信任库支持 ML-DSA。这是一个私有 PKI 实验室,而非公开受信任的层级结构。这符合预期,也是正确的。
Mohammad Amin Kokash 安全工程师 GitHub · Medium
MIT
| CRL | 根 CA | ✅ |
| CRL | 子 CA | ✅ |
| OCSP | 子 CA | ✅ |
| OCSP | 根 CA | ❌ 不适用 |