OpenSSL 命令行指南

最后更新: 2023-07-16 12:40:14 +0800 +0800
原文以英文撰写。您正在阅读AI翻译版本。

OpenSSL 提供密码学原语、协议库和命令行工具。命令适用于检查、互操作性测试和本地管理;应用程序代码应使用受维护的语言库及其安全默认值。

密钥、CSR 与证书 #

使用通用密钥接口生成私钥:

sh
openssl genpkey -algorithm RSA \
  -pkeyopt rsa_keygen_bits:3072 \
  -out private-key.pem
openssl pkey -in private-key.pem -pubout -out public-key.pem

创建证书签名请求并检查其内容:

sh
openssl req -new -key private-key.pem -out request.csr
openssl req -in request.csr -noout -text -verify
openssl x509 -in certificate.pem -noout -text

req -verify 检查 CSR 的持有证明。它不会验证请求的身份,也不会签发证书。CSR 包含公钥和请求属性,绝不包含私钥。

根据显式指定的信任存储验证证书路径:

sh
openssl verify -CAfile roots.pem -untrusted intermediate.pem certificate.pem

PEM 使用带类型标记的 base64 文本封装 DER 对象。应执行显式转换并保留对象类型:

sh
openssl x509 -in certificate.pem -outform DER -out certificate.der
openssl x509 -inform DER -in certificate.der -out certificate.pem
openssl pkey -in private-key.pem -outform DER -out private-key.der

TLS 客户端还需要验证主机名。建立诊断连接时,应传入预期的服务器名称和验证选项:

sh
openssl s_client -connect example.com:443 \
  -servername example.com -verify_hostname example.com

摘要与签名 #

sh
openssl dgst -sha256 artifact.tar
openssl rand -hex 32
openssl dgst -sha256 -sign private-key.pem -out artifact.sig artifact.tar
openssl dgst -sha256 -verify public-key.pem -signature artifact.sig artifact.tar

只有通过已认证通道获得预期摘要值时,摘要才能检测意外更改。签名既能验证摘要,也能验证对相应私钥的持有情况,但是否信任公钥仍是一项独立的部署决策。

基于密码的加密 #

sh
openssl enc -aes-256-cbc -pbkdf2 -salt \
  -in plaintext -out ciphertext

openssl enc 的传统接口不提供现代 AEAD 模式。不要用它自行设计应用程序加密协议。对于需要认证加密的文件,应使用规定明确的 AEAD 格式或专用工具。互操作性要求使用 enc 时,应显式指定摘要和迭代次数,因为默认值可能变化;同时应了解 CBC 密文仍未经过认证。

当命令支持时,应通过受保护的文件或描述符传递秘密。作为命令参数写入的密码可能出现在进程列表和 shell 历史记录中。应限制私钥权限,并仅采用适合相应存储介质的流程删除临时明文。

TLS 诊断 #

s_client 是诊断客户端,不能作为策略完备的应用程序替代品。在排查路径或握手故障时,应添加 -showcerts、-verify_return_error 以及应用程序期望的协议选项:

sh
openssl s_client -connect example.com:443 -servername example.com \
  -verify_hostname example.com -verify_return_error -showcerts

新自动化流程应避免使用 rsautl 等已弃用命令;pkeyutl 和 genpkey 提供当前接口。应使用 openssl list -commands 和 openssl list -providers 检查本地安装的文档,因为提供程序、算法和默认值会随 OpenSSL 版本而异。

评论

在 GitHub 上阅读或评论(发表评论需要登录)