计算机密码学瑞士军刀 step-cli

step-cli 是一个几乎全功能的密码学终端。通常说起这类工具我们第一反应是 openssl 或 cloudflare 出品的 cfssl. 但 smallstep 出品的 step-cli 有很多额外的好处。最近体验了一下,还是非常推荐的。

优点

人性化

我最常用的一个功能是 step ceritificate inspect https://xxx.com 直接查看我管理的网站的证书过期时间。直接通过 url 就能看到人性化展示的证书内容,--short 可以简便看到过期时间。openssl 虽然有 openssl s_client -connect 1.2.3.4:443 -showcerts < /dev/null,但显示的结果远没有 step 那么友好,命令也不是很便捷。

生成证书,生成和签名 CSR 等也十分方便。语法也比较平易近人。openssl 也能摸清它的规律,但往往用起来容易让人不知所措,例如第一次用的人容易不确定应该 rsa, genrsa 还是 rsautl; 证书的功能分布在 ca asn1parse x509, 以及我自己也分不清 pkcs7, pkcs8, pkcs12. 但在 step 中所有涉及证书的工具都被 step certificate 解决了。

最人性化的地方是它的 help 信息十分全面详尽,大多数情况下都有安全使用的范例,你只通过终端就能知道各种命令的用法。所以本文就算想要介绍用法也只不过是拷贝文档中的例子而已。

功能全

它除了 openssl 中那些基础的工具,还囊括了 JOSE (JWT/JWE/JWS/JWK), 还有 NACL/OTP/OAUTH/OIDC, 甚至能够运行自己的 PKI, 还能方便通过证书统一管理主机的 SSH 认证。应有尽有。

step crypto jwt inspect 可以直接检查 jwt 的内容, 与其他命令组合例如:

1
kubectl get secret default-token-abcde -o jsonpath='{.data.token}' | base64 -d | step crypto jwt inspect --insecure

即可获得 jwt 的 json 内容。本地有 key 还可以 step crypto jwt verify 可以检查 jwt 签名。其他 JWK/JWE/JWS 功能不一一列举。

还有 step crypto hash 生成和比较摘要,step crypto otp 生成一次性密码,等等。

安全

step 的一大好处是为用户考量了安全性,所以所有不安全的操作都需要手动指定,甚至不允许。例如生成密钥对默认使用椭圆曲线而不是 RSA; 生成证书或密钥对时会默认要求提供密码;hash 的默认算法是 SHA-256;JWT 不允许任意指定 key 进行签名,而必须要使用 jws.

step 最重要的理念在于,普通人即便懂得密码学的原理,也不应该自己过分涉及任何细节。它只暴露最终用户实际工作中需要的东西,算法只是在生成过程中指定的一个参数而已。所以小白也可以非常安全的使用, 一旦涉及不安全的内容都需要显式指定 --insecure.

密码学是一个完全不同的学科。任何专家都乐于告诉你原理,但他们永远会建议你,遵循最佳实践,不要自己实现现有的工具。普通人遑论实现加密,即便是安全的使用现有的密码学工具都非常困难。很多能力很强的工程师都会在这个问题上犯错误12

缺点

在使用中优点有时也会变成缺点。比如 step 默认生成密钥对的 key 是密码加密的,很多地方不支持;比如不允许任意指定 JWS 签名用的 key。因为安全限制了很多使用场景。