跳至正文
老丹的足迹 —— 代码写给机器,游记写给自己,感悟写给时间
老丹的足迹 老丹的足迹
老丹的足迹 老丹的足迹
  • 首页
  • 示例页面
  • 首页
  • 示例页面
老丹的足迹 老丹的足迹
老丹的足迹 老丹的足迹
  • 首页
  • 示例页面
  • 首页
  • 示例页面

OpenSSL 命令行参数完全解析指南

在前一篇文章中,我们系统梳理了 OpenSSL 的常见使用场景。本文将深入每个命令的参数细节,详细解析每个标志(flag)和选项(option)的含义、作用及最佳实践。理解这些参数能让你从”会用”进阶到”精通”,能够灵活组合命令以适应各种复杂场景。

一、通用参数模式

OpenSSL 的命令行遵循统一的结构模式:

openssl 命令 [命令选项] [参数]

绝大多数命令都接受以下通用参数:

参数全称含义作用说明
-ininput file指定输入文件路径
-outoutput file指定输出文件路径
-passinpassword input提供读取加密私钥所需的密码来源
-passoutpassword output设置输出文件(如新生成的加密私钥)的密码
-nooutno output不输出原始编码数据,仅显示可读信息
-verboseverbose mode打印详细操作日志,便于调试
-engineengine指定硬件加密引擎(如 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:prime256v1
RSA: 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)生成无密码私钥
-noencOpenSSL 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指定扩展配置文件
-reqextsCSR 使用的扩展段

创建带 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
参数含义
-CAfileCA 根证书文件
-CApathCA 证书目录
-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 nPBKDF2 迭代次数默认 10000,建议 100000+
-md消息摘要算法用于密钥派生,如 -md sha256
-base64 / -a输出 Base64 编码便于文本传输
-ABase64 单行输出不换行
-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
-servernameSNI 主机名用于虚拟主机托管
-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证书的友好名称
-canameCA 证书的友好名称
-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证书缺少 SubjectCSR 未正确填写 DN
error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed证书验证失败检查证书链和信任锚

总结

OpenSSL 命令的威力在于参数的灵活组合。掌握每个参数的含义和适用场景,能够帮助你在处理数字证书、加密数据、调试安全连接时做到游刃有余。

学习建议:

  1. 遇到不熟悉的命令时,先执行 openssl 命令 -help 查看简要帮助。
  2. 使用 -verbose 和 -debug 参数观察底层操作。
  3. 在脚本中尽量使用完整的参数名(如 -passin 而非 -pass)以增强可读性。

加密技术日新月异,建议定期关注 OpenSSL 的更新日志和新特性,了解 -pbkdf2、-iter 等新参数以保持配置的最优安全性。

作者

老丹

关注我
其他文章
上一个

X.509标准完全解读:数字世界的“通用身份证”规则

下一个

从“保险柜”到“钥匙扣”:硬件安全模块(HSM)的平民化之路

关于博主

    老丹是一名C/C++后台开发工程师,信奉“无抽象不设计,无性能不生产”。

  • 技术栈:Modern C++、Linux环境编程、多线程/并发、网络编程等。
  • 信条:能用constexpr解决的问题绝不拖到运行时,能靠RAII避免的泄漏绝不写析构。
  • 正在填坑:从解封装到渲染的C++全链路实现,正在驯服FFmpeg与H.264/H.265。
  • 输出原则:这里的每一段代码都经过-Wall -Wextra -Werror -O2的洗礼。

近期文章

  • Linux系统的安全基石:深入理解可插拔认证模块(PAM) 2026年7月27日
  • vsftpd 完全指南:从核心原理到Docker容器化部署 2026年7月27日
  • 互联网的”导航”安全卫士:深入解读DNSSEC 2026年7月27日
  • Ubuntu DNS 配置完全指南 2026年7月27日
  • 在 Ubuntu 中使用 Certbot 的操作指南 2026年7月27日

文章分类

  • C/C++开发 (13)
  • Docker容器 (3)
  • Linux工具包 (10)
  • Linux服务配置 (33)
  • Linux系统 (10)
  • OpenWrt路由 (2)
  • Shell脚本 (3)
  • 安防技术 (4)
  • 数据安全 (30)
  • 网络协议 (17)
  • 计算机理论 (22)
联系我们:📍 地址:中国·广东省深圳市   |   ✉️ 邮箱:support@tanglinux.com   |   💬 QQ:870866607
版权所有:老丹的足迹粤ICP备2026061170号-1       公安备案图标 粤公网安备44030002013274号