Debian Sid常规更新后Node.js报error:0308010C错误解决方法
问题描述
在运行Debian Sid系统的服务器执行常规更新后,zero-ui开发环境无法启动,所有基于nodejs的开发服务器均启动失败,执行启动命令报错核心信息为Error: error:0308010C:digital envelope routines::unsupported,错误码ERR_OSSL_EVP_UNSUPPORTED。
- 当前Node.js版本为
v16.15.0,并非Node 17+版本升级带来的已知兼容问题 - 尝试添加
NODE_OPTIONS=--openssl-legacy-provider参数无效,系统提示该参数不被v16版本Node支持 - 该问题仅在Debian Sid环境可稳定复现,Debian Bookworm环境执行相同操作无异常
问题根因
Debian Sid软件源已将OpenSSL升级至3.0版本,且Debian源分发的Node.js v16.15.0采用动态链接方式依赖系统OpenSSL库,而非官方Node发行版内置的静态链接OpenSSL 1.1.x。旧版本webpack(4.x及对应版本的react-scripts)依赖MD4等哈希算法,这类算法被OpenSSL 3.0默认归入legacy提供者范畴、默认不加载,因此哪怕使用Node 16版本,只要链接的是系统OpenSSL 3.0就会触发该报错。
解决方案
以下方案任选其一即可:
方案1:配置系统OpenSSL 3.0加载legacy算法提供者(全局生效,无需修改项目/Node版本)
编辑系统OpenSSL配置文件/etc/ssl/openssl.cnf,在文件最开头添加如下配置:
openssl_conf = default_conf [default_conf] ssl_conf = ssl_sect [ssl_sect] system_default = system_default_sect [system_default_sect] Providers = provider_sect [provider_sect] default = default_sect legacy = legacy_sect [default_sect] activate = 1 [legacy_sect] activate = 1
保存配置后直接重新执行项目启动命令即可,无需重启系统。
方案2:换用Node.js官方发行版(不修改系统全局配置)
Debian源打包的Node.js动态链接系统OpenSSL,而Node.js官方发布的二进制包静态内置OpenSSL 1.1.x,不存在该兼容问题:
- 先卸载系统源安装的Node.js:
sudo apt remove -y nodejs
- 安装nvm版本管理工具,通过nvm安装官方Node 16版本:
nvm install 16 nvm use 16
- 进入项目目录重新安装依赖后启动服务即可。
方案3:临时会话生效(不修改全局配置,仅当前终端有效)
- 新建自定义OpenSSL配置文件,比如路径为
~/.openssl-legacy.cnf,内容同方案1中的配置段。 - 启动项目前在当前终端执行环境变量声明:
export OPENSSL_CONF=~/.openssl-legacy.cnf
- 正常执行项目启动命令即可,该配置仅对当前终端会话生效,关闭终端后失效。
内容的提问来源于stack exchange,提问作者ZioByte
相关产品推荐
相关产品推荐

