无法编译启用FIPS 140-2模式的Apache,请求技术协助
解决Apache在FIPS 140-2模式下make失败的问题
我帮你梳理下排查这个问题的关键步骤,毕竟用新版本组件配置Apache FIPS模式确实容易踩一些细节坑:
先确认FIPS模块的基础配置是否正确
这是最容易忽略的前提——如果OpenSSL的FIPS模块没装好,后面Apache编译肯定出问题:
- 编译
openssl-fips-2.0.16时,一定要指定明确的安装路径,比如/usr/local/ssl/fips-2.0,并且设置环境变量:
这个环境变量必须在编译后续的OpenSSL和Apache时都保持生效,不然FIPS签名验证会失败。export FIPS_SIG=/usr/local/ssl/fips-2.0/bin/fipsld - 编译
openssl-1.0.2n时,一定要把fips参数放在最前面,确保OpenSSL启用FIPS模式,配置命令参考:
编译完成后,运行./config fips --prefix=/usr/local/ssl --openssldir=/usr/local/ssl/openssl/usr/local/ssl/bin/openssl version -a,输出里必须有FIPS=yes,这才说明FIPS模块生效了。
检查Apache编译配置的细节
编译httpd时,必须确保它完全链接到你刚才编译的FIPS版OpenSSL,而不是系统默认的:
- 正确的configure命令应该包含这些关键参数(根据你的安装路径调整):
重点说下:./configure --prefix=/usr/local/apache2 \ --with-apr=/usr/local/apr \ --with-apr-util=/usr/local/apr-util \ --with-pcre=/usr/local/pcre \ --with-ssl=/usr/local/ssl \ --enable-ssl \ --enable-ssl-staticlib-deps \ --enable-mods-shared=ssl--with-ssl必须指向你自己编译的OpenSSL目录,绝对不能用系统默认的/usr或/usr/local,否则会链接到非FIPS版的库。 - 你提到的“两个exp...选项”,应该是指实验性模块相关的配置(比如
enable-experimental-modules),FIPS模式下很多实验性加密算法是被禁用的,移除这些选项是对的,但要确保其他参数没遗漏。
精准定位make失败的原因
make失败时,终端会输出具体的错误日志,这是排查的核心:
- 如果是链接错误(比如提示找不到
FIPS_mode_set这类函数),大概率是Apache没找到FIPS版OpenSSL的库,检查--with-ssl路径是否正确,或者configure时的检测日志里有没有显示“FIPS support enabled”。 - 如果是编译错误(比如头文件找不到),检查OpenSSL的头文件是否在
/usr/local/ssl/include下,或者configure时是否自动检测到了这些路径。 - 想要更详细的编译日志,运行
make V=1,它会输出每一步的编译命令,更容易找到哪里出问题。
验证依赖库的兼容性
虽然你用的apr、apr-util、pcre版本都是httpd-2.4.29的推荐版本,但也要注意:
- 编译apr-util时,如果启用了SSL支持,一定要加上
--with-ssl=/usr/local/ssl,不然它会链接到系统默认的OpenSSL,导致和Apache用的FIPS版库冲突。 - 确保所有依赖库都是你手动编译的,而不是系统预装的,避免版本不一致的问题。
如果能提供make失败的具体错误输出,我可以帮你更精准地定位问题。
内容的提问来源于stack exchange,提问作者DAC




