遇到 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 个命令都能帮你快速定位问题。