遇到 HTTPS 故障时,最快、最可靠的排查工具永远是 OpenSSL —— 这把安全界的“瑞士军刀”

抛开 CertificateHub、SSL Labs 等图形化界面工具,当服务器突然出现“证书链不完整”,“私钥不匹配”,“TLS 1.3 握手失败”等棘手问题时,一条条精准的命令行就能在几秒内定位问题的根源。

精选生产环境中使用频率最高的 15 个 OpenSSL 命令,涵盖格式转换、本地校验、远程扫描三大场景,帮你快速构建完整的 SSL/TLS 故障诊断能力。

格式转换:PFX、CRT、KEY、PEM 之间的快速互转

证书文件格式五花八门,生产中经常需要格式相互转换。

1. PEM 转 PFX(最常用,Windows/IIS 需要)

openssl pkcs12 -export -out certificate.pfx -inkey privkey.pem -in fullchain.pem -certfile chain.pem

2. PFX 转 PEM(提取证书与私钥)

# 提取私钥
openssl pkcs12 -in certificate.pfx -nocerts -out privkey.pem -nodes
# 提取证书链
openssl pkcs12 -in certificate.pfx -nokeys -out fullchain.pem

3. DER 转 PEM(Java/某些老系统常用 DER 格式)

openssl x509 -inform der -in cert.der -out cert.pem

4. PEM 转 DER

openssl x509 -outform der -in cert.pem -out cert.der

5. 合并证书 + 中间证书为 fullchain.pem(Let's Encrypt 常用)

cat cert.pem chain.pem > fullchain.pem

本地校验:不部署即可检查私钥与证书是否配对

部署前必须验证证书有效性,否则 Nginx/Apache 会启动失败

# 如果两行 MD5 完全相同,则配对成功。
# 计算证书公钥模数
openssl x509 -in fullchain.pem -noout -modulus | openssl md5
# 计算私钥模数
openssl rsa -in privkey.pem -noout -modulus | openssl md5

看证书详细信息(有效期、域名、颁发者)

openssl x509 -in fullchain.pem -noout -text -subject -issuer -dates -ext subjectAltName

查看证书指纹(SHA256,最常用)

openssl x509 -in fullchain.pem -noout -fingerprint -sha256

检查私钥类型与强度(RSA 2048 / ECC P-256)

openssl rsa -in privkey.pem -noout -text | head -n 10
# 或 ECC 私钥
openssl ec -in privkey.pem -noout -text

验证证书链完整性(本地模拟客户端验证)

openssl verify -CAfile /etc/ssl/certs/ca-certificates.crt fullchain.pem

远程扫描:利用 s_client 探测服务器真实状态

如果线上证书有问题时,s_client 是最直接的“探针”。

1. 连接服务器并显示完整证书链(诊断中间证书是否缺失)

# 输出中会出现多个 -----BEGIN CERTIFICATE----- 块,第一块是叶子证书,后续是中间证书。如果只显示一个块,则中间证书缺失。
openssl s_client -connect example.com:443 -servername example.com -showcerts

检查服务器支持的协议版本(排查 TLS 1.0/1.1 是否仍开启)

# 强制 TLS 1.3
openssl s_client -connect example.com:443 -tls1_3
openssl s_client -connect example.com:443 -tls1_2
# 检查是否启用 tls1
openssl s_client -connect example.com:443 -tls1

列出服务器支持的密码套件

openssl s_client -connect example.com:443 -cipher 'ALL:eNULL' -tls1_3

带 OCSP Stapling 检查(验证吊销状态是否正确 stapling)

openssl s_client -connect example.com:443 -status -tlsextdebug

完整诊断一条龙命令

openssl s_client -connect example.com:443 -servername example.com \
  -showcerts -status -tlsextdebug 2>&1 | tee debug.log

实用命令组合与日常运维流程

新证书上线前检查流程

# 1. 检查配对
openssl x509 -in fullchain.pem -noout -modulus | openssl md5
openssl rsa -in privkey.pem -noout -modulus | openssl md5

# 2. 检查链
openssl verify -CAfile ca-bundle.crt fullchain.pem

# 3. 查看关键信息
openssl x509 -in fullchain.pem -noout -text | grep -E 'DNS|Not Before|Not After|Subject:'

线上故障快速定位

#$DOMAIN:域名
openssl s_client -connect $DOMAIN:443 -servername $DOMAIN -showcerts | grep -A 50 "BEGIN CERTIFICATE"

额外高效技巧

批量检查多域名:结合 parallel 或简单 for 循环

for domain in site1.com site2.com; do
  echo "=== $domain ==="
  openssl s_client -connect $domain:443 -servername $domain -quiet 2>&1 | head -n 5
done

生成强私钥与 CSR(申请前使用)

openssl ecparam -genkey -name prime256v1 -noout -out privkey.pem
openssl req -new -key privkey.pem -out csr.pem -subj "CN=example.com"

清理旧会话缓存

openssl s_client -connect example.com:443 -reconnect

OpenSSL 的强大之处在于“零依赖、秒级响应”。无论你是排查 Nginx 启动失败、私钥泄露风险、TLS 版本降级,还是验证 Let's Encrypt 自动续期是否成功,这 15 个命令都能帮你快速定位问题。