OpenSSL 提供密码学原语、协议库和命令行工具。命令适用于检查、互操作性测试和本地管理;应用程序代码应使用受维护的语言库及其安全默认值。
密钥、CSR 与证书 #
使用通用密钥接口生成私钥:
openssl genpkey -algorithm RSA \
-pkeyopt rsa_keygen_bits:3072 \
-out private-key.pem
openssl pkey -in private-key.pem -pubout -out public-key.pem创建证书签名请求并检查其内容:
openssl req -new -key private-key.pem -out request.csr
openssl req -in request.csr -noout -text -verify
openssl x509 -in certificate.pem -noout -textreq -verify 检查 CSR 的持有证明。它不会验证请求的身份,也不会签发证书。CSR 包含公钥和请求属性,绝不包含私钥。
根据显式指定的信任存储验证证书路径:
openssl verify -CAfile roots.pem -untrusted intermediate.pem certificate.pemPEM 使用带类型标记的 base64 文本封装 DER 对象。应执行显式转换并保留对象类型:
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.derTLS 客户端还需要验证主机名。建立诊断连接时,应传入预期的服务器名称和验证选项:
openssl s_client -connect example.com:443 \
-servername example.com -verify_hostname example.com摘要与签名 #
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只有通过已认证通道获得预期摘要值时,摘要才能检测意外更改。签名既能验证摘要,也能验证对相应私钥的持有情况,但是否信任公钥仍是一项独立的部署决策。
基于密码的加密 #
openssl enc -aes-256-cbc -pbkdf2 -salt \
-in plaintext -out ciphertextopenssl enc 的传统接口不提供现代 AEAD 模式。不要用它自行设计应用程序加密协议。对于需要认证加密的文件,应使用规定明确的 AEAD 格式或专用工具。互操作性要求使用 enc 时,应显式指定摘要和迭代次数,因为默认值可能变化;同时应了解 CBC 密文仍未经过认证。
当命令支持时,应通过受保护的文件或描述符传递秘密。作为命令参数写入的密码可能出现在进程列表和 shell 历史记录中。应限制私钥权限,并仅采用适合相应存储介质的流程删除临时明文。
TLS 诊断 #
s_client 是诊断客户端,不能作为策略完备的应用程序替代品。在排查路径或握手故障时,应添加 -showcerts、-verify_return_error 以及应用程序期望的协议选项:
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 上阅读或评论(发表评论需要登录)