为何基于OpenSSL的HTTPS客户端无法验证SSL证书?
CA目录缺少哈希索引:OpenSSL识别目录内的CA证书,依赖以证书哈希值命名的软链接(比如
9d66eef0.0这类格式)。就算/etc/ssl/certs里有证书文件,没正确的哈希链接也白搭。执行c_rehash /etc/ssl/certs(需要root权限)重新生成索引试试。代码中CA路径配置错误:检查
SSL_CTX_load_verify_locations函数的调用是否正确。指定目录时,第二个参数(证书文件路径)要设为NULL,第三个参数(目录路径)填"/etc/ssl/certs",示例代码:if (SSL_CTX_load_verify_locations(ctx, NULL, "/etc/ssl/certs") != 1) { // 处理配置错误 }别搞反参数或者误填了无效的文件路径。
证书链不完整:Google的SSL证书可能依赖中间证书,如果系统CA目录里缺了对应的中间证书,验证会失败。用
openssl s_client -connect google.com:443命令查看完整证书链,对比系统CA目录里是否包含链中所有层级的CA证书。系统时间偏差过大:SSL证书有严格的有效期,要是系统时间和实际时间差太多(比如早于证书生效时间、晚于过期时间),验证直接失败。用
date命令检查系统时间,确保和网络时间同步。OpenSSL版本兼容问题:旧版本OpenSSL可能不支持新的证书算法或根CA。用
openssl version查看当前版本,必要时升级到稳定的新版本。未开启强制验证模式:确认代码里是否设置了正确的验证规则,比如调用
SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL);,如果误设成SSL_VERIFY_NONE会跳过验证,但这里是验证失败,要确保是开启了对端证书强制验证。
内容的提问来源于stack exchange,提问作者Dimitrios Desyllas

