处理 Node 报错 Error: error:0308010c:digital envelope routines::unsupported

现象

重装系统,安装了最新长期支持版 nodejs v18.16,再次启动项目报错如下:

Starting the development server...
i Compiling Webpack
node:internal/crypto/hash:71
  this[kHandle] = new _Hash(algorithm, xofLen);
                  ^

Error: error:0308010C:digital envelope routines::unsupported
    at new Hash (node:internal/crypto/hash:71:19)
    at Object.createHash (node:crypto:133:10)

错误原因

出现这个错误是因为 node.js V17 版本之后发布的 OpenSSL3.0 , 而 OpenSSL3.0 对允许算法和密钥大小增加了严格的限制,可能会对生态系统造成一些影响。

解决方案

可以通过 3 种方式来解决这个错误

一、降级(旧项目的解决之道)

考虑将你的 Node 版本降级到 16.16.0 或其他 LTS 版本。

二、修改 package.json

在相关构建命令之前加入SET NODE_OPTIONS=--openssl-legacy-provider 【当然服务端还是原来的版本,仅适用于本地开发】

"scripts": {
    "start": "set NODE_OPTIONS=--openssl-legacy-provider && cross-env UMI_ENV=dev umi dev",
    "start:dev": "set NODE_OPTIONS=--openssl-legacy-provider && cross-env REACT_APP_ENV=dev MOCK=none UMI_ENV=dev umi dev",
  },

三、升级相关的最新包(面向未来)

将相关用到加密算法的包升级到支持 最新 node 的版本,当然这个在生产使用是有兼容性风险的还可能有相应的隐形成本。

本文如:crypto-js(但很遗憾,该包已是最新版),最后使用方案二来解决。

最后补充一点:
关于:SET NODE_OPTIONS=–openssl-legacy-provider,其实这种方法不能一劳永逸,它的legacy的中文意思翻译过来是经典的,传统的,对于目前2022年12月4号来说,openssl3.0是最新的,之前的版本属于legacy版本,但是随着时间的推移,
未来可能在2024年,openssl3.0可能也变成了legacy版本,此时再设置SET NODE_OPTIONS=–openssl-legacy-provider,来通知nodejs使用传统的openSSL来执行,那么可能就会运行错误。那么对于产品的迭代维护来说,最好的话,还是使用旧版本的nodejs,比如16版本的,这个才可能是解决问题的关键。

https://www.cnblogs.com/hmy-666/p/16949982.html

引文:
https://www.freecodecamp.org/chinese/news/error-error-0308010c-digital-envelope-routines-unsupported-node-error-solved/
nodejs新版本引起的:digital envelope routines::unsupported – 兜里还剩五块出头 – 博客园 (cnblogs.com)

Author: thinkwei

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注