OpenSSL应用忽略openssl.cnf指定默认自定义引擎的问题咨询
问题原因
- OpenSSL默认不会自动加载全局配置:OpenSSL 1.1及以上版本中,libcrypto库被加载时不会自动初始化全局配置,只有显式调用了
OPENSSL_config()、OPENSSL_init_ssl()或ENGINE_load_builtin_engines()等初始化接口的程序才会读取openssl.cnf中的引擎配置。你测试用的EVP示例代码仅直接调用加解密接口,没有执行OpenSSL配置初始化逻辑,因此不会加载自定义引擎。 - 部分程序硬编码算法实现逻辑:部分调用OpenSSL的程序会直接获取内置算法实现指针,没有走OpenSSL的算法查找、引擎匹配流程,就算配置加载成功也不会调用自定义引擎。
- 链接版本不匹配:如果程序静态链接了OpenSSL,或者动态链接的libcrypto.so不是你修改了配置文件对应的OpenSSL版本,配置不会生效。
可行解决方案(无需修改OpenSSL源码)
- 方法1:LD_PRELOAD钩子强制初始化配置
编写一个极小的动态库,在库的构造函数中自动执行OpenSSL配置初始化逻辑,示例代码如下:
#include <openssl/conf.h> #include <openssl/engine.h> __attribute__((constructor)) void init_openssl_config() { // 加载OpenSSL全局配置 OPENSSL_config(NULL); // 加载所有内置引擎,触发配置中自定义引擎的初始化 ENGINE_load_builtin_engines(); ENGINE_register_all_complete(); }
编译命令:gcc -fPIC -shared -o libopenssl_init.so libopenssl_init.c -lcrypto
单次测试时运行程序前设置环境变量即可生效:LD_PRELOAD=/path/to/libopenssl_init.so ./main
如果需要全局对所有动态链接OpenSSL的程序生效,将该库的绝对路径写入/etc/ld.so.preload文件即可。
- 方法2:校验程序链接与权限
- 执行
ldd <程序路径>确认程序动态链接的libcrypto.so路径和你修改配置的OpenSSL版本一致,静态链接OpenSSL的程序无法通过全局配置生效。 - 确认程序运行身份有权限读取你修改的openssl.cnf文件,以及自定义引擎so文件的执行权限正常。
- 执行
- 注意事项
带setuid/setgid权限的程序会忽略LD_PRELOAD和ld.so.preload的配置,这类程序无法通过该方案强制加载引擎,必须修改程序源码重新编译。
内容的提问来源于stack exchange,提问作者Mitch Lindgren
相关产品推荐
相关产品推荐

