step-ca 0.30.2 常用 CLI 命令详解
step CLI 0.30.2 全命令实测:ca health/provisioner/certificate/renew/revoke 与 certificate inspect/create/fingerprint,覆盖 JWK 与 ACME 两条签发路径,排障报错逐行照抄
step-ca 0.30.2 常用 CLI 命令详解
目标:系统梳理 step CLI(Smallstep CLI 0.30.2)的日常命令——健康探测、provisioner 查询、JWK 与 ACME 两条签发路径、续期、吊销、证书检查与离线自签——每条命令均附真实实测回显;排障报错逐行照抄,可直接对照排错。
一、环境信息
- 操作系统:Linux x86_64
- Smallstep CLI:0.30.2(
Smallstep CLI/0.30.2 (linux/amd64),Release Date: 2026-03-22 23:21 UTC) - Smallstep CA:0.30.2(服务端,
Smallstep CA/0.30.2 (linux/amd64),Release Date: 2026-03-23 00:18 UTC) - CA 服务地址:
https://ca.stepca.internal:9000(客户端已配置该主机名解析) - 已配置 provisioner:
admin(JWK,密码q1w2e3r4)、acme-step(ACME) - 客户端工作目录:
/home/step/work(含root_ca.crt根证书与密码文件.prov.pass) - 根证书指纹:
2a4d06b866972e6227494089dc788d6706f70f10ed102c7261607b860c45ff5e
二、工具概览
step CLI 的命令树分两大族:
| 命令族 | 面向 | 本文覆盖 |
|---|---|---|
step ca <子命令> | 与 CA 服务端交互(health/provisioner/certificate/renew/revoke) | 第四章 |
step certificate <子命令> | 本地证书操作(inspect/create/fingerprint),多数不联网 | 第五章 |
贯穿两条签发路径:
- JWK 路径:静态密钥认证(provisioner 名 + 密码),适合管理员手工签发与脚本注入;
- ACME 路径:RFC 8555 挑战认证(http-01 standalone),无需密码,适合自动化客户端。
三、前置条件
- 客户端已放置 CA 根证书
root_ca.crt(从 CA 的https://<ca>/roots.pem下载或带外复制); - 客户端能把
ca.stepca.internal解析到 CA 服务器,且主机名在 CA 配置dnsNames列表内(见配置详解篇 5.2); - 准备密码文件避免交互(权限 600):
mkdir -p /home/step/work && cd /home/step/work
echo 'q1w2e3r4' > .prov.pass && chmod 600 .prov.pass
四、CA 服务端交互命令(step ca)
4.1 step version:确认版本
step version
实测回显:
Smallstep CLI/0.30.2 (linux/amd64)
Release Date: 2026-03-22 23:21 UTC
4.2 step ca health:健康探测
step ca health --ca-url https://ca.stepca.internal:9000 --root root_ca.crt
实测回显:
ok
服务不可达时的真实报错(故意指向未监听的 9443 端口,逐行照抄):
client GET https://ca.stepca.internal:9443/health failed: dial tcp 10.89.56.3:9443: connect: connection refused
⚠️ 注意:省略
--ca-url时默认探测https://localhost:9000,仅当命令在本机 CA 上执行才成立;跨机探测必须显式给出--ca-url与--root——这是健康检查误报 unhealthy 的头号根因(排障实录见部署篇 Q1)。
4.3 step ca provisioner list:查询签发授权
step ca provisioner list --ca-url https://ca.stepca.internal:9000 --root root_ca.crt
实测回显(完整 JSON,两个 provisioner;encryptedKey 原样保留):
[
{
"type": "JWK",
"name": "admin",
"key": {
"use": "sig",
"kty": "EC",
"kid": "0oxx6mWKNZVsQGXbkVua5nuy-EV2zgCUCUIMy-odYpE",
"crv": "P-256",
"alg": "ES256",
"x": "e5b-D49KrFmOJ3zShdidPXOR7hC3qCfkIiVd9jAUuis",
"y": "U5B246ykzPr2ifagDo43kopO2Dfe_zcqG0zPVAu_Pjo"
},
"encryptedKey": "eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjdHkiOiJqd2sranNvbiIsImVuYyI6IkEyNTZHQ00iLCJwMmMiOjYwMDAwMCwicDJzIjoiNUdab192UWdwMDh4T1VtVkYzMzF1QSJ9.OZuoyjKIyBbQY4At_aZwBVqv2Os3kF7zhlasGzvGHL6Ae2ZgUo6xBQ.Zz9N2FhoFgjTB8Jy.KTVFZAISdeJIfZQCx4JepWkQe0aiomKRAV9vGRPCFu2OeIqn1LSTYm8tAIdKJXc8zhuH7kLxUdPteR3Ci0gg5eNdwEK-mAFw2VfMujOpLOEgVwYbhUmgx-GLKe92q5-jvoMyC-zYWumqJrG5w8egS0DBJ9cucmZnG83-SPBy9wMTOy2D0Y2cGO9m6vNH88rq-sypkdSHC2aTrPr20hoHBDfKI0yj1QJtDxe4aoS3ofKrA5zpkzafxNfBI6ka2evgXc2uRI7TopxmZAARn6e-uuxeIxM6ynkMvaScmkWBrWaP4HqfW2r_Ix1cojXNbgWC2ck-kp4SxiZRK8jG0es.L7OlncXMVMFvoFnyvBOnCA"
},
{
"type": "ACME",
"name": "acme-step",
"claims": {
"enableSSHCA": true,
"disableRenewal": false,
"allowRenewalAfterExpiry": false,
"disableSmallstepExtensions": false
},
"options": {
"x509": {},
"ssh": {}
}
}
]
4.4 step ca certificate:签发证书(JWK 路径)
step ca certificate acme-test.internal acme-test.crt acme-test.key \
--ca-url https://ca.stepca.internal:9000 \
--root root_ca.crt \
--provisioner admin \
--password-file .prov.pass \
--not-after 24h
实测回显(逐行照抄):
✔ Provisioner: admin (JWK) [kid: 0oxx6mWKNZVsQGXbkVua5nuy-EV2zgCUCUIMy-odYpE]
✔ CA: https://ca.stepca.internal:9000
✔ Certificate: acme-test.crt
✔ Private Key: acme-test.key
常用参数:
| 参数 | 作用 |
|---|---|
| 位置参数 1 | 证书 Subject 与默认 SAN(域名或 IP) |
| 位置参数 2/3 | 输出的证书文件 / 私钥文件 |
--provisioner | provisioner 名称(provisioner list 里查) |
--password-file | provisioner 密码注入,免交互 |
--not-after 24h | 有效期;相对时间(24h/48h)或绝对时间(2026-12-31T00:00:00Z) |
--san | 追加额外 SAN,可重复 |
--san 10.89.56.2 | IP 形式 SAN 同样支持 |
💡 说明:私钥在客户端本地生成,只有 CSR 上送 CA;这是私钥不出机的安全模型。
4.5 step ca certificate:签发证书(ACME 路径)
ACME provisioner(acme-step)无需密码,通过 http-01 挑战证明域名控制权。--standalone 模式由 step CLI 临时在本机 80 端口应答挑战(需 root 或相应端口能力;域名必须解析回本机,CA 会回连验证):
step ca certificate acme-svc.internal.example.com acme-svc.crt acme-svc.key \
--provisioner acme-step \
--ca-url https://ca.stepca.internal:9000 \
--root root_ca.crt \
--standalone
实测回显(逐行照抄):
✔ Provisioner: acme-step (ACME)
Using Standalone Mode HTTP challenge to validate acme-svc.internal.example.com . done!
Waiting for Order to be 'ready' for finalization .. done!
Finalizing Order .. done!
✔ Certificate: acme-svc.crt
✔ Private Key: acme-svc.key
签发后的证书检查(step certificate inspect --short 实测):
X.509v3 TLS Certificate (ECDSA P-256) [Serial: 2714...3287]
Subject: acme-svc.internal.example.com
Issuer: Smallstep Internal CA Intermediate CA
Provisioner: acme-step
Valid from: 2026-10-31T04:22:07Z
to: 2026-11-01T04:23:07Z
💡 技术拓展:
--standalone(CLI 自起 80 端口应答挑战)之外,ACME 还有--webroot(把挑战文件放到既有 Web 目录)与--http-listen(自定义端口)模式;标准 certbot/Caddy/cert-manager 客户端对接同一 ACME 端点时按各自方式完成挑战。
4.6 step ca renew:续期
step ca renew acme-test.crt acme-test.key \
--ca-url https://ca.stepca.internal:9000 \
--root root_ca.crt \
--force
实测回显:
Your certificate has been saved in acme-test.crt.
要点:
- 续期以原证书+私钥向
/renew端点认证,不需要 provisioner 密码; - 未到期续期需
--force;官方推荐窗口是到期前 2/3 时段内自动续; - 常驻自动续期加
--daemon(可配--renew-period、--interval),配合 systemd 托管实现证书永续; - 续期会生成新私钥(默认
--reuse-key可保留旧钥)。
4.7 step ca revoke:吊销
先签一张专用证书再吊销(实测全程):
step ca certificate revoke-me.internal rev.crt rev.key \
--ca-url https://ca.stepca.internal:9000 --root root_ca.crt \
--provisioner admin --password-file .prov.pass
step ca revoke --cert rev.crt --key rev.key \
--ca-url https://ca.stepca.internal:9000 --root root_ca.crt
实测回显(签发部分同 4.4,吊销部分逐行照抄):
✔ CA: https://ca.stepca.internal:9000
Certificate with Serial Number 280286226882480500563967958883881994852 has been revoked.
要点:
--cert+--key:以证书自身认证吊销自己(无需密码);也可用--serial <序列号> --provisioner admin --password-file .prov.pass以管理员身份吊销他人证书;- 吊销状态记录在 CA 的
db/库(badger),CA 重启后仍生效; - 吊销是"记入数据库"而非"证书立刻失效"——已部署的 TLS 会话仍会信任到自然过期,关键场景需配合短有效期对冲。
4.8 step ca 的其余常用子命令
| 子命令 | 用途 |
|---|---|
step ca init | 初始化 PKI(交互实录见部署篇) |
step ca root [file] | 下载根证书(https://<ca>/roots.pem 的 CLI 封装) |
step ca fingerprint | 输出 CA 根证书指纹(客户端信任比对用) |
step ca ssh certificate | 签发 SSH 用户/主机证书(SSH CA 能力) |
step ca ssh config | 生成 OpenSSH 配置片段(known_hosts/证书认证) |
step ca token | 生成一次性签发令牌(给无密码自动化管道用) |
五、本地证书工具命令(step certificate)
5.1 step certificate inspect:检查证书内容
step certificate inspect acme-test.crt --short
实测回显:
X.509v3 TLS Certificate (ECDSA P-256) [Serial: 3205...0687]
Subject: acme-test.internal
Issuer: Smallstep Internal CA Intermediate CA
Provisioner: admin [ID: 0oxx...dYpE]
Valid from: 2026-10-31T04:15:14Z
to: 2026-11-01T04:16:14Z
- 去掉
--short输出完整 X.509 文本(含 SAN/扩展/签名算法); --format json输出 JSON 形态,便于脚本解析;--roots root_ca.crt可校验链完整性,--server-name可模拟 SNI 校验。
5.2 step certificate create:离线自签证书
step certificate create selftest.local self.crt self.key \
--profile self-signed --subtle --no-password --insecure --force
实测回显:
Your certificate has been saved in self.crt.
Your private key has been saved in self.key.
⚠️ 注意:
--profile self-signed必须同时给--subtle,否则报错(真实回显,逐行照抄):'--profile self-signed' requires the '--subtle' flag
常用 profile:leaf(叶子证书,可配 --ca/--ca-key 用自备 CA 签)、self-signed(自签根/自签叶子)、root-ca/intermediate-ca(手工搭 PKI)。--no-password --insecure 表示私钥明文落盘(实验用);生产离线根私钥必须加密(去掉这两个参数并设置密码)。
5.3 step certificate fingerprint:计算指纹
step certificate fingerprint self.crt
step certificate fingerprint root_ca.crt
实测回显:
f7a3779fc8b5d6ff00beed117d0467e89aab25ac17dd42d4b220a2ce94e6834b
2a4d06b866972e6227494089dc788d6706f70f10ed102c7261607b860c45ff5e
第二条正是 CA 根证书指纹,与 init 输出、https://<ca>/fingerprint 页面一致——客户端首次连接 CA 前用它人工核对信任锚,是防中间人的关键一步。
六、注意事项
- 凭据分层:CA 密码(解锁中间 CA 私钥)与 provisioner 密码(JWK 签名)是两把锁,init 时同源生成;ACME 路径完全无密码,但只覆盖它能挑战的域名;
- 主机名即信任边界:
--ca-url的主机名必须命中 CAdnsNames,SAN 必须覆盖客户端要保护的名字——名字错=证书白签; --force的边界:renew/create 的--force会无提示覆盖已有文件,脚本里先备份;- 文件属主:以特权身份执行签发后,产物属主是特权身份,普通用户后续读取会
permission denied(真实踩坑:step certificate inspect报open acme-svc.crt failed: permission denied,chown 1000:1000后恢复); - token 模式优先:CI/CD 中不建议放 provisioner 密码,用
step ca token生成短时效令牌传给签发端。
七、常见问题
Q1:connection refused / dial tcp ...?
CA 未监听该地址端口,或解析到的 IP 不对。先用 step ca health --ca-url ... --root ... 探测(回显见 4.2),再核对 DNS/hosts 与 CA 监听配置。
Q2:报 The request was valid, but the server could not process it 或授权被拒?
常见三种:provisioner 名拼错(用 4.3 的 list 核对)、密码文件内容错(含多余换行)、证书有效期超出 provisioner claims 上限(默认 max 24h,见配置详解篇 5.5.3)。
Q3:ACME 挑战一直 pending?
http-01 要求 CA 能回连客户端的 80 端口且域名解析正确:客户端域名解析回客户端 IP、--standalone 进程存活、80 端口未被防火墙拦截。三查:解析、进程、防火墙。
Q4:续期报 certificate is not due for renewal?
还没到续期窗口(默认到期前 2/3 时间内)。加 --force 立即续(本文实测即用 --force)。
Q5:吊销后为什么还在信任?
吊销状态只在 CA 的数据库中,客户端是否查询取决于其吊销检查策略;对高敏感证书用短有效期(如 24h)+ 自动续期,把"吊销滞后"的影响压到一个周期内。
八、参考链接
- Smallstep CLI 官方文档 — https://smallstep.com/docs/step-cli/ (查询日期 2026-10-31)
step ca certificate命令参考 — https://smallstep.com/docs/step-cli/commands/ca/certificate/ (查询日期 2026-10-31)step ca renew命令参考 — https://smallstep.com/docs/step-cli/commands/ca/renew/ (查询日期 2026-10-31)- 官方 ACME 端点文档 — https://smallstep.com/docs/step-ca/acme/ (查询日期 2026-10-31)
- GitHub 仓库 smallstep/certificates — https://github.com/smallstep/certificates (查询日期 2026-10-31)
- 站内《step-ca 0.30.2 Docker Compose 部署指南》 — https://www.quzuo.net/document/cXJikDkUOZp7
- 站内《step-ca 0.30.2 配置参数详解》 — https://www.quzuo.net/document/EULFdV7D9m9R
- 站内《Smallstep Certificates 介绍与选型指南》 — https://www.quzuo.net/document/KIfB9rTqBgRD