You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,稳定版)就能完美解决问题:

  1. 下载OpenSSL 1.0.2o源码,解压后编译安装:
    ./config --prefix=/usr/local/openssl-1.0.2o shared zlib
    make && sudo make install
    
  2. 编译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:

  1. 找到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)
  2. 重新编译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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:27:15