Apache 2.4.33与OpenSSL 1.1.0h编译报错求助:X509函数未定义
解决Apache 2.4.33 + OpenSSL 1.1.0h编译时的未定义引用错误
我来帮你搞定这个卡了两周的编译问题——你遇到的是OpenSSL 1.1.0的API变更与Apache 2.4.33兼容性不匹配导致的链接错误,核心原因是OpenSSL 1.1.0对X509证书相关的函数做了重大调整,但Apache 2.4.33的代码还在调用旧版本的API,所以链接器找不到这些符号。
下面给你三个可行的解决方案,按稳妥程度排序:
方案1:降级OpenSSL到兼容版本(最推荐)
Apache 2.4.33是2018年发布的,当时OpenSSL 1.1.0的API适配还不完善,直接降级到和它同期的OpenSSL 1.0.2系列(比如1.0.2o,稳定版)就能完美解决问题:
- 下载OpenSSL 1.0.2o源码,解压后编译安装:
./config --prefix=/usr/local/openssl-1.0.2o shared zlib make && sudo make install - 编译Apache时指定这个OpenSSL的安装路径:
./configure --prefix=/usr/local/apache2 --with-ssl=/usr/local/openssl-1.0.2o make clean && make && sudo make install
方案2:手动修改Apache代码适配OpenSSL 1.1.0
如果你坚持要用OpenSSL 1.1.0h,需要修改ab.c里的过时函数调用,因为OpenSSL 1.1.0把一些宏定义改成了函数,还重命名了部分API:
- 找到Apache源码里的
support/ab.c文件,修改以下几行:- 第649行:把
X509_get_version改成X509_get_version(cert)(确保传入X509指针参数) - 第651行:
X509_getm_notBefore(cert)→X509_get0_notBefore(cert) - 第655行:
X509_getm_notAfter(cert)→X509_get0_notAfter(cert)
- 第649行:把
- 重新编译Apache,记得指定OpenSSL 1.1.0h的路径:
./configure --prefix=/usr/local/apache2 --with-ssl=/usr/local/openssl-1.1.0h make clean && make && sudo make install
方案3:强制指定OpenSSL的链接参数
有时候编译时链接器没找到正确的OpenSSL库,也会出现这类错误,可以在configure时强制指定头文件和库路径:
./configure --prefix=/usr/local/apache2 \ --with-ssl=/usr/local/openssl-1.1.0h \ --with-ldflags="-L/usr/local/openssl-1.1.0h/lib" \ --with-cppflags="-I/usr/local/openssl-1.1.0h/include" make clean && make && sudo make install
总结
优先选方案1,降级OpenSSL是最省心的,不会有代码修改带来的潜在问题;如果必须用OpenSSL 1.1.0,方案2的代码修改是核心,方案3可以作为辅助排查手段。
内容的提问来源于stack exchange,提问作者AR01
相关产品推荐
相关产品推荐

