在启用FIPS的RHEL8服务器上禁用NodeJS级FIPS的方法咨询
解决系统FIPS启用时Node.js级FIPS禁用问题
在启用系统级FIPS的RHEL 8.10服务器上,执行CI=false npm run build构建Node.js应用时出现以下报错:
Error: error:060800C8:digital envelope routines:EVP_DigestInit_ex:disabled for FIPS at new Hash (node:internal/crypto/hash:69:19) at createHash (node:crypto:136:10)
同款应用在另一台相同系统版本(RHEL 8.10)、相同OpenSSL版本(1.1.1k FIPS)的服务器上可正常构建,核心差异为:
- 报错服务器:Node.js v18.20.4,
node -p 'crypto.getFips()'返回1(Node级FIPS启用) - 正常服务器:Node.js v18.20.3,
node -p 'crypto.getFips()'返回0(Node级FIPS未启用)
需求:保持系统级FIPS启用的前提下,禁用Node.js级FIPS;无法修改系统FIPS配置,仅能控制Node.js安装。尝试node -p 'crypto.setFips(0)'时触发报错:
Error [ERR_CRYPTO_FIPS_SYSTEM_CONTROLLED]: Cannot set FIPS mode. FIPS should be enabled/disabled at system level.
可行解决方案
方案1:降级Node.js到v18.20.3
Node.js v18.20.3在系统FIPS启用的环境下不会自动启用Node级FIPS,与正常构建服务器保持一致版本即可直接解决问题:
- 使用nvm安装:
nvm install 18.20.3 nvm use 18.20.3 - 手动安装二进制包:下载对应版本的二进制包解压后,将其
bin目录添加到系统PATH中,或使用官方RPM包安装。
方案2:通过环境变量强制禁用Node级FIPS
在执行构建命令前设置NODE_FIPS=0环境变量,覆盖Node.js对系统FIPS的检测逻辑:
NODE_FIPS=0 CI=false npm run build
也可以在当前shell会话中预先设置环境变量,后续所有Node.js相关命令均生效:
export NODE_FIPS=0 CI=false npm run build
方案3:编译Node.js时禁用FIPS支持(适用于必须使用v18.20.4的场景)
手动编译Node.js v18.20.4并关闭FIPS选项:
- 下载源码包:
wget https://nodejs.org/dist/v18.20.4/node-v18.20.4.tar.gz - 解压并进入目录:
tar -xzf node-v18.20.4.tar.gz cd node-v18.20.4 - 配置编译选项(禁用FIPS):
./configure --without-fips - 编译并安装:
make -j$(nproc) sudo make install
编译完成后,执行node -p 'crypto.getFips()'应返回0,此时构建应用不会触发FIPS相关错误。
内容的提问来源于stack exchange,提问作者Egor
相关产品推荐
相关产品推荐

