编译自定义OpenSSL时出现tls_process_server_certificate证书验证失败错误
自定义编译OpenSSL证书验证失败的排查与解决
问题背景
使用系统全局OpenSSL(1.1.1f)时,应用可通过第三方WebSocket代码正常建立SSL连接;但链接自行编译的同版本(1.1.1f)或稳定版(1.1.1t)OpenSSL时,出现证书验证失败错误。编译命令为:
../config --prefix=/linux shared -fPIC make sudo make install_sw
排查与解决步骤
- 检查自定义OpenSSL的默认证书路径
系统OpenSSL默认读取系统证书存储(如/etc/ssl/certs/),但自定义编译的OpenSSL会默认使用--prefix指定路径下的ssl目录(即/linux/ssl)。运行以下命令确认:
/linux/bin/openssl version -d
如果输出的目录下没有系统证书链,就会导致验证失败。解决方式二选一:
- 重新编译OpenSSL时指定系统证书路径:
../config --prefix=/linux shared -fPIC --openssldir=/etc/ssl make clean && make && sudo make install_sw - 将系统证书目录内容复制到自定义OpenSSL的证书目录,并修复权限:
cp -r /etc/ssl/certs/ /linux/ssl/ chmod -R 755 /linux/ssl/certs/
显式配置应用的证书验证路径
第三方WebSocket库可能依赖OpenSSL默认路径,若自定义路径与系统不同,需在代码中显式指定CA证书:- 使用OpenSSL API时,调用
SSL_CTX_set_default_verify_paths(ctx)让库自动查找系统默认证书;或直接指定证书文件:SSL_CTX_load_verify_locations(ctx, "/etc/ssl/certs/ca-certificates.crt", NULL); - 检查WebSocket库的配置选项,确认是否有设置CA证书路径的参数,确保指向有效证书文件。
- 使用OpenSSL API时,调用
验证自定义OpenSSL的证书链有效性
用自定义OpenSSL命令测试目标服务器的证书验证:
/linux/bin/openssl s_client -connect your_ws_host:port
查看输出中的Verify return code,若为0 (ok)则正常,否则根据错误提示排查。同时运行c_rehash生成证书哈希链接(确保OpenSSL能找到证书链):
/linux/bin/c_rehash /linux/ssl/certs/
- 确认编译与安装的完整性
make install_sw仅安装库和头文件,不会生成默认证书目录结构。若其他项目是手动指定了证书路径,当前项目未配置则会出错。可以改用make install安装完整配置(注意不要覆盖系统OpenSSL),或手动创建/linux/ssl/certs/目录并复制证书。另外,用ldd your_app检查应用是否确实链接了自定义OpenSSL库,避免误链接系统版本。
内容的提问来源于stack exchange,提问作者Jay Evans
相关产品推荐
相关产品推荐

