PostgreSQL启动报错:undefined symbol: EVP_cast5_cbc(pgcrypto扩展问题)
问题解决:PostgreSQL启动时pgcrypto报
undefined symbol: EVP_cast5_cbc错误 原因分析
- pgcrypto未关联OpenSSL库:从
ldd输出可见,pgcrypto.so未依赖任何OpenSSL相关库,但pgcrypto的加密算法依赖OpenSSL提供支持,这是核心问题。 - OpenSSL 3.0算法兼容性:
EVP_cast5_cbc属于CAST5算法,在OpenSSL 3.0中该算法被归类到legacy provider,默认未启用,即便关联了OpenSSL也可能无法找到符号。
解决步骤
1. 重新编译PostgreSQL,确保关联OpenSSL
源码编译时需明确指定OpenSSL路径,让pgcrypto正确链接加密库:
# 进入PostgreSQL源码目录 cd /path/to/postgresql-15.6 # 清理旧编译文件 make clean # 配置编译参数(OpenSSL默认安装可省略路径,否则替换为实际安装路径) ./configure --prefix=/usr/local/pgsql --with-openssl=/usr/local/ssl # 重新编译并安装 make world make install-world
2. 启用OpenSSL 3.0的legacy provider
若重新编译后仍报错,需修改OpenSSL配置启用遗留算法:
- 编辑OpenSSL配置文件(通常为
/etc/ssl/openssl.cnf),找到[provider_sect]段,修改为:
[provider_sect] default = default_sect legacy = legacy_sect [default_sect] activate = 1 [legacy_sect] activate = 1
- 保存配置后重启PostgreSQL:
pg_ctl restart -D /usr/local/pgsql/data
3. 验证库关联状态
重新编译后执行以下命令,确认pgcrypto.so已关联OpenSSL库:
ldd /usr/local/pgsql/lib/pgcrypto.so
输出中应包含libssl.so、libcrypto.so等OpenSSL相关依赖项。
验证修复效果
启动PostgreSQL服务:
pg_ctl start -D /usr/local/pgsql/data
服务正常启动后,进入数据库验证pgcrypto功能:
CREATE EXTENSION IF NOT EXISTS pgcrypto; SELECT crypt('test_password', gen_salt('bf'));
若能正常返回加密结果,说明问题已解决。
内容的提问来源于stack exchange,提问作者Definitly not me
相关产品推荐
相关产品推荐

