必须显式调用SSL_CTX_load_verify_locations()加载可信根CA证书,否则证书验证失效;OpenSSL默认不信任任何CA,SSL_connect()成功不代表证书可信,常见于连自签名服务器无报错但存在中间人风险。

SSL_CTX_load_verify_locations必须显式调用,否则证书验证形同虚设
OpenSSL默认不信任任何CA,SSL_connect() 成功不代表证书可信——它可能只是跳过了验证。常见现象是连上自签名服务器不报错,但实际已遭中间人攻击。
必须在创建SSL_CTX后、建立连接前,调用SSL_CTX_load_verify_locations()加载可信根证书文件:
- 路径必须可读,且为纯PEM格式(以
-----BEGIN CERTIFICATE-----开头,无BOM、无空行) - 第二个参数传
nullptr表示只从文件加载,不查目录;若传目录路径,需确保目录已用c_rehash处理过 - 务必检查返回值:返回0说明失败,立即用
ERR_print_errors_fp(stderr)查原因(常见是路径错、权限不足、内容不是CA证书) - 别把服务端证书(
server.crt)当CA证书传入——它不含CA:TRUE标志位,无法用于链式验证
X509_check_host才是正确的域名匹配方式,别碰CN字段
手动比对X509_get_subject_name()里的CN字段是过时且危险的做法。现代证书基本不依赖CN,RFC 6125明确要求优先校验subjectAltName(SAN)中的DNS条目。
直接用X509_check_host(),它内置通配符处理、大小写归一、IDN转换逻辑:
立即学习“C++免费学习笔记(深入)”;
- 传入的域名必须是ASCII字符串(如
"api.example.com"),不能是UTF-8原始中文域名;需先调用idn_to_ascii_8z()转换 - 第四个参数
flags至少含X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS,否则*.example.com会错误匹配www.sub.example.com - 返回
1= 匹配,0= 不匹配,负数 = 错误(如证书无DNS名、内存分配失败) - 若环境受限无法用该函数(如OpenSSL NID_subject_alt_name扩展,逐个提取
GEN_DNS项,并确认ASN1_STRING_type()为V_ASN1_IA5STRING
证书链完整性检查常被忽略,导致“verify ok”但实际不可信
SSL_get_verify_result()返回X509_V_OK只表示本地验证通过,不代表链完整。常见坑是服务端没发全中间证书,客户端手里只有根CA和服务器证书,缺一级中间CA,此时OpenSSL可能仍返回OK(尤其在旧版本中)。
必须主动检查证书链长度和颁发者匹配:
- 调用
SSL_get_peer_certificate()拿到服务器证书后,用sk_X509_num(SSL_get_peer_cert_chain(ssl))确认链中证书数量 ≥ 2(服务器证书 + 至少一个中间CA) - 用
X509_NAME_cmp(X509_get_issuer_name(leaf), X509_get_subject_name(intermediate))逐级比对颁发者/主体是否衔接 - 若链不完整,应拒绝连接——不能依赖
SSL_set_verify(ssl, SSL_VERIFY_NONE, nullptr)绕过,那等于放弃验证
OpenSSL 3.0+ 的provider机制影响证书加载行为
OpenSSL 3.0起引入provider模型,默认启用legacy provider,但若显式调用OSSL_PROVIDER_load(NULL, "default")或配置了openssl.cnf,可能禁用部分旧算法,导致某些老CA证书(如SHA-1签名的根证书)加载失败或验证被拒。
实操建议:
- 调试阶段加
OPENSSL_CONF=/dev/null环境变量,排除配置干扰 - 用
openssl x509 -in ca.crt -text -noout确认证书签名算法(如sha256WithRSAEncryption)是否被当前provider支持 - 若必须兼容旧CA,显式加载
legacyprovider:OSSL_PROVIDER_load(NULL, "legacy"),并在SSL_CTX_new()前完成 - 注意
SSL_CTX_set_default_passwd_cb()在3.0+中行为变化:若私钥加密,回调函数必须返回int而非void,否则加载静默失败
SSL_get_verify_result() == X509_V_OK变成假阳性。


















