OpenSSL 命令行参数完全解析指南
在前一篇文章中,我们系统梳理了 OpenSSL 的常见使用场景。本文将深入每个命令的参数细节,详细解析每个标志(flag)和选项(option)的含义、作用及最佳实践。理解这些参数能让你从”会用”进阶到”精通”,能够灵活组合命令以适应各种复杂场景。
一、通用参数模式
OpenSSL 的命令行遵循统一的结构模式:
openssl 命令 [命令选项] [参数]
绝大多数命令都接受以下通用参数:
| 参数 | 全称含义 | 作用说明 |
|---|---|---|
-in | input file | 指定输入文件路径 |
-out | output file | 指定输出文件路径 |
-passin | password input | 提供读取加密私钥所需的密码来源 |
-passout | password output | 设置输出文件(如新生成的加密私钥)的密码 |
-noout | no output | 不输出原始编码数据,仅显示可读信息 |
-verbose | verbose mode | 打印详细操作日志,便于调试 |
-engine | engine | 指定硬件加密引擎(如 Intel QAT) |
密码来源格式详解(-passin 和 -passout):
# 1. 直接在命令行提供(最不安全)
openssl rsa -in key.pem -passin pass:mysecret123
# 2. 从文件读取(推荐)
openssl rsa -in key.pem -passin file:password.txt
# 3. 从环境变量读取
openssl rsa -in key.pem -passin env:MY_PASSWORD
# 4. 从标准输入读取
openssl rsa -in key.pem -passin stdin
# 5. 从文件描述符
openssl rsa -in key.pem -passin fd:3
二、密钥生成命令(genpkey 和 genrsa)参数详解
2.1 genpkey — 通用私钥生成器(推荐)
openssl genpkey -algorithm RSA -out key.pem -pkeyopt rsa_keygen_bits:2048 -aes-256-cbc -passout pass:123
参数全解析:
| 参数 | 含义 | 可选值/说明 |
|---|---|---|
-algorithm | 指定密钥算法 | RSA, DSA, EC, DH, X25519, ED25519 |
-out | 输出私钥文件路径 | 任意合法路径 |
-pkeyopt | 算法特定选项 | RSA: rsa_keygen_bits:n (n=1024/2048/3072/4096)EC: ec_paramgen_curve:prime256v1RSA: rsa_keygen_pubexp:65537(指定公钥指数) |
-cipher 或具体加密算法 | 对私钥进行对称加密 | -aes-128-cbc, -aes-256-cbc, -des3 等 |
-passout | 加密私钥的密码来源 | 见上节密码格式 |
-text | 打印密钥参数的可读文本 | 调试用,通常与 -noout 结合 |
算法特定选项详解:
# 生成 EC 密钥(p256 曲线)
openssl genpkey -algorithm EC -out ec_key.pem -pkeyopt ec_paramgen_curve:prime256v1 -pkeyopt ec_enc_named_curve
# 生成带公钥指数的 RSA 密钥(自定义指数)
openssl genpkey -algorithm RSA -out key.pem -pkeyopt rsa_keygen_bits:4096 -pkeyopt rsa_keygen_pubexp:3
2.2 genrsa — RSA 专用生成器(传统)
openssl genrsa -out key.pem -passout pass:123 -aes256 2048
| 参数 | 含义 |
|---|---|
-out | 输出文件 |
-passout | 密码来源 |
-aes128/-aes192/-aes256/-des3 | 加密算法 |
n (位置参数) | 密钥位数,默认 2048 |
三、密钥查看与转换(rsa、ec、pkey)参数详解
3.1 pkey — 通用密钥处理工具(推荐)
openssl pkey -in private.pem -text -noout -pubout -out public.pem
| 参数 | 含义 | 使用场景 |
|---|---|---|
-in | 输入密钥文件 | 支持 RSA/EC/DSA 任意格式 |
-out | 输出文件 | 可输出私钥或公钥 |
-pubin | 指示输入是公钥 | 处理公钥时添加此标志 |
-pubout | 输出公钥格式 | 从私钥提取公钥时使用 |
-text | 输出可读的结构化信息 | 查看密钥模数、指数、曲线等 |
-noout | 不输出编码后的密钥数据 | 与 -text 配合只查看信息 |
-inform/-outform | 输入/输出格式 | PEM(默认)/ DER(二进制)/ PVK |
-passin/-passout | 密码来源 | 处理加密密钥时必需 |
格式转换示例:
# PEM 转 DER(二进制)
openssl pkey -in key.pem -out key.der -outform DER
# DER 转 PEM
openssl pkey -in key.der -inform DER -out key.pem
3.2 RSA 专用工具(rsa)
传统命令,功能和 pkey 重叠,但对于理解历史参数仍重要:
openssl rsa -in key.pem -check -modulus -noout
| 参数 | 含义 |
|---|---|
-check | 检查 RSA 私钥的有效性 |
-modulus | 打印模数(Modulus)的十六进制值 |
-pubin / -pubout | 输入/输出公钥 |
四、证书与 CSR 命令(req、x509)参数详解
4.1 req — 证书请求与自签名工具
openssl req -new -key priv.pem -out req.csr -subj "/CN=example.com" -days 365 -extensions v3_req -config openssl.cnf
核心参数分类解析:
A. 操作模式参数
| 参数 | 含义 | 组合使用 |
|---|---|---|
-new | 生成新的 CSR | 与 -key 或 -newkey 结合 |
-newkey | 同时生成新密钥和 CSR | 后跟算法参数:rsa:2048 或 ec:prime256v1 |
-x509 | 输出自签名证书而非 CSR | 替代 -new,生成证书 |
-renew | 续签已有证书 | 需输入旧证书 |
-verify | 验证 CSR 签名 | 检查 CSR 是否被篡改 |
B. 密钥参数
| 参数 | 含义 | 示例 |
|---|---|---|
-key | 使用已有私钥 | -key priv.pem |
-keyout | 新生成密钥的输出路径 | 与 -newkey 配合 |
-nodes | 不加密私钥(no DES) | 生成无密码私钥 |
-noenc | OpenSSL 3.0+ 替代 -nodes | 更明确的命名 |
C. 证书主体信息(Subject)
| 参数 | 含义 | 字段说明 |
|---|---|---|
-subj | 非交互式指定 DN | /C=CN/ST=BJ/L=HD/O=Org/OU=IT/CN=example.com |
-addext | 添加扩展字段 | -addext "subjectAltName=DNS:example.com,DNS:*.example.com" |
DN(Distinguished Name)字段详细说明:
/C= Country(国家,两位字母代码)/ST= State/Province(州/省)/L= Locality(城市)/O= Organization(组织)/OU= Organizational Unit(部门)/CN= Common Name(通用名称,对于 SSL 证书,这是主域名)/emailAddress= 邮箱地址/DC= Domain Component(域组件,如DC=org)
D. 扩展参数(Extensions)
| 参数 | 含义 |
|---|---|
-extensions | 使用配置文件中的哪个扩展段 |
-extfile | 指定扩展配置文件 |
-reqexts | CSR 使用的扩展段 |
创建带 SAN(Subject Alternative Name)的 CSR 的完整示例:
# 方式1:使用 -addext(OpenSSL 1.1.1+)
openssl req -new -key priv.pem -out req.csr -subj "/CN=example.com" -addext "subjectAltName=DNS:example.com,DNS:www.example.com"
# 方式2:使用扩展配置文件
openssl req -new -key priv.pem -out req.csr -config <(cat /etc/ssl/openssl.cnf <(printf "\n[SAN]\nsubjectAltName=DNS:example.com,DNS:*.example.com")) -reqexts SAN
4.2 x509 — 证书显示与处理工具
openssl x509 -in cert.pem -text -noout -date -issuer -subject -fingerprint -serial -hash -subject_hash -ocspid
完整参数列表:
| 参数 | 含义 | 输出示例 |
|---|---|---|
-text | 完整可读的证书信息 | 包含所有字段和扩展 |
-noout | 不输出证书原始编码 | 配合 -text 使用 |
-dates | 显示有效期 | notBefore=... / notAfter=... |
-issuer | 显示颁发者 DN | 输出 Issuer 字段 |
-subject | 显示主体 DN | 输出 Subject 字段 |
-email | 显示邮件地址 | 从 Subject 提取 |
-fingerprint | 显示 SHA-1 指纹 | 带冒号分隔的十六进制 |
-sha256 | 指定指纹哈希算法 | -fingerprint -sha256 |
-serial | 显示证书序列号 | 十六进制数字 |
-hash | 显示证书哈希值 | 用于 Apache 的 SSLCACertificatePath |
-subject_hash | 同 -hash | 针对 Subject 的哈希 |
-issuer_hash | 显示 Issuer 的哈希 | 用于 OpenSSL 目录结构 |
-ocspid | 显示 OCSP 使用的哈希 | 用于 OCSP Stapling |
-purpose | 显示证书用途 | 检查 SSL Server / SSL Client 等 |
-checkend n | 检查证书是否在 n 秒内过期 | 返回 0 如果未过期 |
-alias | 显示证书别名 | 仅用于 PKCS#12 |
-startdate / -enddate | 单独显示开始/结束日期 | 脚本解析方便 |
组合使用技巧:
# 检查证书是否将在 30 天内过期(监控用)
openssl x509 -in cert.pem -checkend 2592000 && echo "Valid" || echo "Will expire soon"
# 批量查看多个证书
for cert in *.crt; do openssl x509 -in $cert -noout -subject -dates; done
4.3 验证命令 verify
openssl verify -CAfile root.pem -CApath /certs/ -CRLfile revoke.crl -purpose sslserver -verbose cert.pem
| 参数 | 含义 |
|---|---|
-CAfile | CA 根证书文件 |
-CApath | CA 证书目录 |
-CRLfile | 证书吊销列表文件 |
-purpose | 验证目的 |
-policy | 策略检查 |
-verbose | 显示详细错误信息 |
-untrusted | 中间证书文件 |
五、加密与解密命令(enc)参数详解
openssl enc -aes-256-cbc -salt -pbkdf2 -iter 10000 -in plain.txt -out cipher.bin -base64 -pass pass:123 -md sha256 -nosalt -z -debug
完整参数列表:
| 参数 | 含义 | 默认值/说明 |
|---|---|---|
-e / -d | 加密/解密模式 | 加密(默认) |
-cipher | 对称加密算法 | 算法名称位置,如 -aes-256-cbc |
-salt / -nosalt | 使用/不使用盐值 | 强烈建议启用,防御彩虹表 |
-pbkdf2 | 使用 PBKDF2 密钥派生 | OpenSSL 1.1.1+,推荐 |
-iter n | PBKDF2 迭代次数 | 默认 10000,建议 100000+ |
-md | 消息摘要算法 | 用于密钥派生,如 -md sha256 |
-base64 / -a | 输出 Base64 编码 | 便于文本传输 |
-A | Base64 单行输出 | 不换行 |
-k / -pass | 密码来源 | -k password 或 -pass file:... |
-salt | 生成随机盐值 | 默认启用(OpenSSL 1.1.1+) |
-nosalt | 禁用盐值 | 不推荐 |
-z | 启用压缩(如果编译支持) | 减少数据大小 |
-debug | 打印调试信息 | 显示密钥、IV 等 |
算法选择建议:
# 现代推荐方案(AES-256-GCM 带认证加密)
openssl enc -aes-256-gcm -salt -pbkdf2 -iter 100000 -in data.txt -out data.bin -pass pass:secret
# 注意:GCM 需要 OpenSSL 1.1.0+,且解密需要相同的 nonce
六、消息摘要命令(dgst)参数详解
openssl dgst -sha256 -prverify priv.pem -signature sig.bin -hex -binary -out hash.txt data.txt
| 参数 | 含义 | 使用场景 |
|---|---|---|
-sha256 / -md5 等 | 指定哈希算法 | 位置参数 |
-hex | 输出十六进制格式 | 默认格式 |
-binary | 输出二进制格式 | 用于程序间传递 |
-out | 输出文件 | 保存哈希值 |
-verify | 使用公钥验证签名 | 后跟公钥文件 |
-prverify | 使用私钥验证签名 | 后跟私钥文件 |
-signature | 签名文件路径 | 与 -verify 配合 |
-hmac key | 使用 HMAC 密钥 | -hmac "secret" |
-mac alg | 使用 MAC 算法 | -mac hmac -macopt key:... |
-sigopt | 签名算法参数 | 如 RSA 的 padmode:pss |
数字签名完整流程:
# 1. 生成文件的 SHA-256 签名(使用私钥)
openssl dgst -sha256 -sign private.pem -out signature.bin data.txt
# 2. 验证签名(使用公钥)
openssl dgst -sha256 -verify public.pem -signature signature.bin data.txt
七、SSL/TLS 诊断(s_client)参数详解
openssl s_client -connect example.com:443 -tls1_2 -servername www.example.com -showcerts -CAfile root.pem -cert client.pem -key client.key -verify_return_error -starttls smtp -brief
核心参数分类:
A. 连接参数
| 参数 | 含义 | 示例 |
|---|---|---|
-connect | 目标主机:端口 | -connect google.com:443 |
-host / -port | 分离的主机和端口 | 替代 -connect |
-servername | SNI 主机名 | 用于虚拟主机托管 |
-starttls | 协议升级 | smtp, pop3, imap, ftp, xmpp |
B. TLS 版本控制
| 参数 | 含义 |
|---|---|
-tls1_2 | 仅使用 TLS 1.2 |
-tls1_3 | 仅使用 TLS 1.3 |
-no_tls1_2 / -no_tls1_3 | 禁用特定版本 |
-ssl3 | 使用 SSL 3.0(危险,已弃用) |
C. 证书与密钥
| 参数 | 含义 |
|---|---|
-cert / -key | 客户端证书和私钥(双向 TLS) |
-CAfile / -CApath | 信任的 CA 证书 |
-verify n | 要求客户端证书深度 n |
-showcerts | 显示完整的证书链 |
-x509_strict | 严格的 X.509 验证 |
-verify_return_error | 验证失败时终止连接 |
D. 输出控制
| 参数 | 含义 |
|---|---|
-brief | 简洁输出(减少调试信息) |
-prexit | 在连接关闭后打印会话信息 |
-status | 启用 OCSP Stapling 检查 |
-nextprotoneg | 协商 ALPN/NPN 协议 |
-tlsextdebug | 调试 TLS 扩展 |
实用诊断命令组合:
# 查看服务器支持的加密套件
openssl s_client -connect example.com:443 -cipher 'ALL' -no_tls1_3 2>&1 | grep "Cipher"
# 测试特定加密套件
openssl s_client -connect example.com:443 -ciphers 'ECDHE-RSA-AES128-GCM-SHA256'
# 导出服务器证书
openssl s_client -connect example.com:443 -showcerts </dev/null | sed -n '/-----BEGIN/,/-----END/p' > server.crt
八、其他实用命令参数速查
8.1 rand — 随机数生成
openssl rand -hex 16 -out rand.bin -base64 -engine rdrand
| 参数 | 含义 |
|---|---|
-hex / -base64 | 输出编码格式 |
-out | 输出文件 |
-engine | 硬件随机数生成引擎 |
num (位置参数) | 生成字节数 |
8.2 dhparam — Diffie-Hellman 参数
openssl dhparam -out dh.pem -5 2048 -text -dsaparam
| 参数 | 含义 |
|---|---|
-2 / -5 | 生成器(2 或 5) |
-dsaparam | 使用 DSA 参数生成(更快) |
-text | 输出可读参数 |
n (位置参数) | 密钥长度(推荐 2048+) |
8.3 pkcs12 — PKCS#12 格式转换
openssl pkcs12 -export -in cert.crt -inkey key.pem -out bundle.p12 -name "MyCert" -caname "RootCA" -descert -password pass:123 -maciter -nomacverify
| 参数 | 含义 |
|---|---|
-export | 导出 PKCS#12 |
-nokeys | 不包含私钥 |
-cacerts | 仅导出 CA 证书 |
-name | 证书的友好名称 |
-caname | CA 证书的友好名称 |
-descert | 使用 DES 加密私钥(兼容性) |
-maciter | 对 MAC 使用迭代加密 |
-nomacverify | 跳过 MAC 验证 |
九、配置文件详解(openssl.cnf)
OpenSSL 的许多行为受配置文件控制,默认位于 /etc/ssl/openssl.cnf。
关键配置段(Section)说明:
# req 命令的默认配置
[ req ]
default_bits = 2048
default_md = sha256
distinguished_name = req_distinguished_name
req_extensions = v3_req
# 证书主体 DN 的提示字段
[ req_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = AU
stateOrProvinceName = State or Province Name
localityName = Locality Name
organizationName = Organization Name
organizationalUnitName = Organizational Unit Name
commonName = Common Name (eg, your name or server hostname)
# v3 扩展
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names
# 自定义 SAN 扩展
[ alt_names ]
DNS.1 = example.com
DNS.2 = *.example.com
命令行覆盖配置:
# 使用自定义配置文件
openssl req -new -key key.pem -out req.csr -config myconfig.cnf
# 临时覆盖单个配置项
openssl req -new -key key.pem -out req.csr -config <(cat /etc/ssl/openssl.cnf <(echo "default_md = sha512"))
十、常见错误代码解析
| 错误信息 | 含义 | 解决方案 |
|---|---|---|
unable to load Private Key | 无法加载私钥 | 检查路径、权限,或使用 -passin 提供密码 |
PEM_read_bio:no start line | 文件格式不是 PEM | 尝试指定 -inform DER |
verify error:num=20 | 证书链不完整 | 使用 -untrusted 提供中间证书 |
self signed certificate in certificate chain | 自签名证书 | 使用 -CAfile 信任该证书 |
bad decrypt | 解密失败 | 密码错误或算法不匹配 |
no certificate subject name | 证书缺少 Subject | CSR 未正确填写 DN |
error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed | 证书验证失败 | 检查证书链和信任锚 |
总结
OpenSSL 命令的威力在于参数的灵活组合。掌握每个参数的含义和适用场景,能够帮助你在处理数字证书、加密数据、调试安全连接时做到游刃有余。
学习建议:
- 遇到不熟悉的命令时,先执行
openssl 命令 -help查看简要帮助。 - 使用
-verbose和-debug参数观察底层操作。 - 在脚本中尽量使用完整的参数名(如
-passin而非-pass)以增强可读性。
加密技术日新月异,建议定期关注 OpenSSL 的更新日志和新特性,了解 -pbkdf2、-iter 等新参数以保持配置的最优安全性。