OpenSSL 证书与加密速查表 - OpenSSL 常用命令大全

配过证书的人都走过同一个循环:生成 → 自检 → 再用,而 openssl 在每个环节都有对应命令。表按六个环节组织:证书查看解析本地文件确认主题、SAN、有效期与指纹;远程检查把线上实际生效的证书拉下来读;生成覆盖自签名证书与 CSR;私钥处理含生成、查看与权限;格式转换处理 DER、PEM、PFX 互转。最容易被忽略但每季度都要用一次的是远程检查:openssl s_client -connect host:443 -servername 域名 会带上 SNI,多域名证书漏掉 -servername 时返回的可能是默认站点那张不相关的证书,于是误判「证书没换」。另一个高频坑在格式转换:PKCS12 转 PEM 不加 -nodes,私钥会被密码保护,Nginx 读不了。

系统与运维·共 33 条命令·最后更新 2026-07-21
openssltlsssl证书加密

证书查看 Inspect Certificate 6

openssl x509 -in cert.pem -text -noout
查看证书完整信息(含颁发者、有效期、SAN)
openssl x509 -in cert.pem -dates -noout
只看有效期(notBefore / notAfter)
openssl x509 -in cert.pem -issuer -noout
只看颁发者
openssl x509 -in cert.pem -subject -noout
只看主体(域名)
openssl x509 -in cert.pem -ext subjectAltName -noout
查看 SAN(多域名),证书覆盖的所有域名
openssl x509 -in cert.pem -fingerprint -sha256 -noout
查看 SHA-256 指纹

远程证书检查 Remote Check 5

echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -dates
查看远程服务器证书有效期
echo | openssl s_client -connect example.com:443 -showcerts 2>/dev/null
查看完整证书链
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -text -noout
查看远程证书完整信息
openssl s_client -connect example.com:443 -servername example.com -tls1_2
指定 TLS 版本测试连接
openssl s_client -connect example.com:443 -servername example.com -tls1_3
测试 TLS 1.3 连接

证书生成 Generate Certificate 6

openssl genrsa -out private.key 2048
生成 2048 位 RSA 私钥
openssl ecparam -genkey -name prime256v1 -out private.key
生成 EC 私钥(更小更快)
openssl req -new -key private.key -out request.csr
用私钥生成 CSR(证书签名请求)
openssl req -new -newkey rsa:2048 -nodes -keyout private.key -out request.csr
一步生成私钥和 CSR
openssl req -x509 -newkey rsa:2048 -nodes -keyout private.key -out cert.pem -days 365 -subj "/CN=localhost"
生成自签名证书(365 天)
openssl req -x509 -newkey rsa:2048 -nodes -keyout key.pem -out cert.pem -days 365 -subj "/CN=localhost" -addext "subjectAltName=DNS:localhost,DNS:*.localhost"
自签名证书含 SAN 多域名

私钥处理 Private Key 5

openssl rsa -in private.key -check -noout
检查私钥是否有效
openssl rsa -in encrypted.key -out plain.key
去除私钥密码保护(需输入原密码)
openssl rsa -in plain.key -aes256 -out encrypted.key
给私钥加 AES-256 密码保护
openssl rsa -in private.key -pubout -out public.key
从私钥导出公钥
openssl pkey -in private.key -noout
通用私钥查看(兼容 RSA 和 EC)

格式转换 Format Conversion 4

openssl pkcs12 -export -out cert.p12 -inkey private.key -in cert.pem
PEM 转 PKCS12(.p12/.pfx)
openssl pkcs12 -in cert.p12 -out cert.pem -nodes
PKCS12 转 PEM(含私钥,-nodes 不加密)
openssl pkcs12 -in cert.p12 -info -noout
查看 PKCS12 内容
openssl crl2pkcs7 -nocrl -certfile cert.pem -out cert.p7b
PEM 转 PKCS7(.p7b)

加密与哈希 Encrypt & Hash 7

echo -n "hello" | openssl md5
计算 MD5 哈希
echo -n "hello" | openssl sha256
计算 SHA-256 哈希
openssl dgst -sha256 file.txt
计算文件 SHA-256
openssl enc -aes-256-cbc -in file.txt -out file.enc -pass pass:secret
AES-256-CBC 加密文件
openssl enc -d -aes-256-cbc -in file.enc -out file.txt -pass pass:secret
AES-256-CBC 解密文件
openssl rand -hex 32
生成 32 字节随机十六进制字符串
openssl rand -base64 32
生成 32 字节随机 Base64 字符串

命令示例

查看远程服务器证书有效期

echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -dates

-servername 是发送 SNI,不加的话可能拿到默认站点的证书。2>/dev/null 滤掉 s_client 的握手调试输出,只留证书内容。

输出

notBefore=Aug 12 00:00:00 2026 GMT
notAfter=Nov 10 23:59:59 2026 GMT

确认证书覆盖哪些域名

openssl x509 -in cert.pem -ext subjectAltName -noout

SAN 才是浏览器实际校验的域名列表,CN 已不再被主流浏览器采信。排查「证书有效但浏览器报错」先看这里。

输出

X509v3 Subject Alternative Name:
    DNS:example.com, DNS:*.example.com, DNS:www.example.com

生成带 SAN 的自签名证书(本地开发用)

openssl req -x509 -newkey rsa:2048 -nodes -keyout key.pem -out cert.pem \ -days 365 -subj "/CN=localhost" \ -addext "subjectAltName=DNS:localhost,DNS:127.0.0.1"

-addext 加 SAN 是关键:没有 SAN 的自签证书在现代浏览器和 Node.js 里都会直接判无效。127.0.0.1 也要写进 SAN,否则访问 IP 时报错。

输出

Generating a RSA private key...
.+..........+
writing new private key to 'key.pem'

校验文件 SHA-256

openssl dgst -sha256 package.tar.gz sha256sum -c package.tar.gz.sha256

下载后先用 sha256sum -c 核对来源提供的校验和再解压。openssl dgst 计算,sha256sum -c 验证,两步配套使用。

输出

SHA2-256(package.tar.gz)= 9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08
package.tar.gz: OK

常见坑与注意事项

  • openssl s_client 不加 -servername 时可能拿到默认站点的证书,检查到的有效期不一定是你访问的那个域名。
  • 私钥去掉密码保护(-nodes 或 rsa -out plain.key)后任何能读到该文件的人都能解密,落地文件务必 chmod 600。
  • --no-check-certificate 类跳过校验的选项让中间人攻击变得可行,只在调试时临时使用。
  • 自签名证书缺 SAN 时浏览器与多数运行时都会判为无效,生成时务必带 -addext subjectAltName。
  • 证书到期前未续期会导致全站 HTTPS 报错;用 -dates 定期检查并接入监控告警。

提示

  • 查远程证书有效期加 -servername(SNI),否则多域名证书可能返回默认证书。
  • Let's Encrypt 证书到期前用 echo | openssl s_client 确认实际部署的证书已更新,不要只看文件时间戳。
  • PKCS12 转 PEM 时加 -nodes 否则导出的私钥会被密码保护,Nginx/Traefik 无法直接读取。
  • openssl x509 -in cert.pem -noout -text -dates 可以只读元数据不解码,用 -fingerprint -sha256 取指纹核对证书是否已轮换。
  • openssl s_client -connect host:443 </dev/null 2>/dev/null | openssl x509 -noout -dates 能一条命令拿到线上证书的到期时间,适合做监控探针。
  • 生成密钥时用 openssl genrsa -out key.pem 2048 并紧跟 chmod 600 key.pem,私钥权限过宽是审计里最常被扣分的一项。

官方参考来源

下方为命令对应的官方权威文档,供你核对最新用法与深入查阅。

由 巧匠 维护

公开更新于 2026年7月21日,内容持续校对官方文档。

联系我们

命令或描述有误?提交反馈、商务合作或产品建议都可发送邮件给我们。

联系我们