在 Linux 下使用 OpenSSL 时,“调试问题”通常分为几类:证书/TLS 连接问题、命令行用法问题、程序调用 OpenSSL 库的问题。下面按常见场景给你一套实用调试思路。
openssl s_client 测试连接openssl s_client -connect example.com:443 -servername example.com
常用参数:
-debug # 打印详细调试信息
-state # 显示握手状态
-CAfile ca.pem # 指定 CA 证书
-showcerts # 显示完整证书链
示例(查看证书是否过期、域名是否匹配):
openssl s_client -connect example.com:443 | openssl x509 -noout -text
openssl x509 -in cert.pem -noout -text
openssl x509 -in cert.pem -noout -dates
openssl x509 -in cert.pem -noout -subject -issuer
openssl s_client -connect example.com:443 -tls1_2
openssl s_client -connect example.com:443 -tls1_3
openssl ciphers -v
openssl version
openssl version -a
不同版本(1.0.2 / 1.1.1 / 3.x)行为差异很大。
openssl genrsa -out test.key 2048 -verbose
C 程序中:
ERR_print_errors_fp(stderr);
export OPENSSL_TRACE=ALL
export OPENSSL_CONF=/path/to/openssl.cnf
openssl errstr <错误码>
例如:
openssl errstr 14094418
openssl verify -CAfile ca.pem cert.pem
openssl verify -untrusted intermediate.pem cert.pem
unable to get local issuer certificate → CA 缺失certificate has expired → 证书过期hostname mismatch → SAN / CN 不匹配tcpdump -i any -w tls.pcap port 443
再用 Wireshark 分析 TLS 握手失败原因。
| 问题 | 排查方式 |
|---|---|
| 连接被拒 | telnet host 443 |
| TLS 握手失败 | s_client -debug |
| 证书不被信任 | openssl verify |
| 自签名证书 | 手动指定 -CAfile |
| 版本不兼容 | 指定 -tls1_2 / -tls1_3 |
如果你有具体报错信息或场景(例如:Nginx + OpenSSL、Python requests、C 程序 SSL_connect 失败),可以直接贴出来,我可以帮你精确定位。