Node.js 17.0.1 Gatsby错误 - “数字信封例程::不支持... ERR_OSSL_EVP_UNSUPPORTED”

172

我正在构建一个Gatsby网站。我将Node.js升级到v17.0.1,但在运行构建时出现错误:

Error: digital envelope routines::unsupported

opensslErrorStack: [ 'error:03000086:digital envelope routines::initialization error' ],
library: 'digital envelope routines',
reason: 'unsupported',
code: 'ERR_OSSL_EVP_UNSUPPORTED'

如果我将其降级到v16,它就可以正常工作,并且构建将成功。 我该怎么解决这个问题?

从谷歌搜索来看,这可能是类似的问题: 错误:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt #48

13个回答

275
这可能会有所帮助。将这些脚本添加到package.json文件中。

React:

"scripts": {
    "start": "export SET NODE_OPTIONS=--openssl-legacy-provider && react-scripts start",
    "build": "export SET NODE_OPTIONS=--openssl-legacy-provider && react-scripts build"
}

如果你使用的是 React.js,并且你在 Windows 平台上编程,可以使用以下语法将脚本中的 export 替换为 set
"scripts": {
    "start": "set SET NODE_OPTIONS=--openssl-legacy-provider && react-scripts start",
    "build": "set SET NODE_OPTIONS=--openssl-legacy-provider && react-scripts build"
}

或者

"scripts": {
    "start": "react-scripts --openssl-legacy-provider start",
    "build": "react-scripts --openssl-legacy-provider build",
}

Vue.js:

"scripts": {
    "serve": "export NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve",
    "build": "export NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service build",
    "lint": "export NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service lint"
},

如果你正在使用 Vue.js 并且在 Windows 上,你可以在你的脚本中使用 set 代替 export,如下所示:

"scripts": {
    "serve": "set NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve",
    "build": "set NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service build",
    "lint": "set NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service lint"
},

或者

"scripts": {
    "serve": "vue-cli-service --openssl-legacy-provider serve",
    "build": "vue-cli-service --openssl-legacy-provider build",
    "lint": "vue-cli-service --openssl-legacy-provider lint"
},

Angular:

"scripts": {
 "start": "set NODE_OPTIONS=--openssl-legacy-provider  && gulp buildDev && ng serve ",
 "publish": "set NODE_OPTIONS=--openssl-legacy-provider  && gulp build && ng build --prod",
},

在Vue中进行这些更改后,如何启动开发服务器? - Chamindu
与之前相同:npm run serve - Pierre Henry
2
谢谢你的帮助。我有一个简单的问题,是什么导致了这个问题? - kayongo Johnson Brian
2
只需在项目根目录中运行以下命令:export NODE_OPTIONS=--openssl-legacy-provider - Vidurajith Darshana
2
这个方法可行,但我仍然不明白问题出在哪里。是什么导致了这个问题? - Pythoner
我正在使用yarn,并且我的package.json文件中包含以下命令:"build-dev": "yarn install && webpack --config ./Config/webpack.config.dev.js --colors"。我该如何在这里应用修复?我尝试过的所有方法都没有起作用。 - Daniel R

188

快速修复:在您的React项目内的终端中运行此命令。

export NODE_OPTIONS=--openssl-legacy-provider

4
我在这里使用 Node v17 为 Mastodon 服务器工作。谢谢! - MegaTux
6
那应该放在哪里?在一个脚本文件中?在终端手动输入?何时应用它?在什么情境下?在那个终端之后还需要运行什么?你所说的“在 React 项目内的终端中运行此命令”是什么意思?在什么环境下?在 Visual Studio Code 环境下吗?还是其他?能详细说明一下吗?请通过编辑(修改)您的答案进行回复,而不是在评论中回复(不要使用“编辑:”,“更新:”或类似的内容 - 答案应当看起来像是今天写的)。 - Peter Mortensen
5
节点:NODE_OPTIONS中不允许使用--openssl-legacy-provider。 - Krishnadas PC
2
我在评论区没有写什么内容? - Peter Mortensen
3
不知道它是怎么做到的,但它起作用了。有人能解释一下吗?我在源代码控制中没有看到任何东西,所以不太确定这里发生了什么。 - Jan Peeter
显示剩余4条评论

99
这很可能是webpack的问题。
  • 如果您使用的是版本4,则此问题已在版本4.47.0中得到修复(发布链接)。
  • 如果您使用的是版本5,则此问题已在版本5.61.0中得到修复(发布链接)。
升级webpack到以上列出的版本之外的版本应该可以解决这个问题。
请参阅此问题的讨论以了解最初发现该错误时的详细信息: 最终,这与webpack使用md4哈希有关,他们的解决方法是改用WASM实现md4算法,而不是使用Node的内置实现(Node的实现依赖于OpenSSL,因此会出现错误)。
请注意,尽管webpack团队的一位成员曾表示他们不打算将修复程序回溯到webpack 4,但版本v4.47.0仍然包含了自定义的md4实现,以支持Node 18及以上版本。

原始回复:

Gatsby / Gatsby 使用的工具可能正在使用一种 加密算法或密钥大小,这在 OpenSSL 3.0 中默认不再允许。

来自 Node.js 17 的公告文章

如果你在 Node.js 17 中的应用程序中遇到 ERR_OSSL_EVP_UNSUPPORTED 错误,很可能是你的应用程序或你正在使用的模块尝试使用一种在 OpenSSL 3.0 中默认不再允许的算法或密钥大小。为了暂时解决这些限制,已添加了一个新的 命令行选项 --openssl-legacy-provider,用于恢复到旧的提供程序。

在终端上运行可能如下所示:

node --openssl-legacy-provider ./node_modules/.bin/gatsby build

你还可以通过NODE_OPTIONS环境变量传递这个参数。
所以,如果你想继续使用NPM脚本,你可以将build脚本改为:
// package.json
{
  "scripts": {
    "build": "NODE_OPTIONS=--openssl-legacy-provider gatsby build"
  }
}

这个命令可以消除错误: node --openssl-legacy-provider ./node_modules/.bin/gatsby build非常感谢! 这是否意味着未来需要由Gatsby团队(甚至是它所依赖的任何模块)来修复这个问题? - David
1
是的,从您发布的错误信息来看,我无法确定是 Gatsby 直接出了问题还是他们正在使用的某个模块出了问题。我想他们很快就会发布一个修复此问题的版本。 - romellem
我将webpack从5.35.1升级到了5.61.0,问题得到了解决,非常感谢。 - 27P

28

这个问题是由Node.js 17的新更新引起的。 在React中,您可以更改 package.json 文件中的脚本属性为:

"scripts": {
    "start": "react-scripts --openssl-legacy-provider start",
    "build": "react-scripts --openssl-legacy-provider build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
}

有没有办法使这个能够在旧版和新版的Node中正常工作?如果你在旧版的Node中运行它,那么会抛出一个错误,说命令行标志未被识别。 - Colin D

20

我之前也遇到了同样的问题,所以我降低了 Node.js 的版本:

  • 卸载 Node.js

  • 然后下载并安装 16.13.0 版本。


8
你也可以使用 nvm 切换 Node 版本。 - Mahmoud Nasr
2
我强烈建议在每个平台上使用nvm,因为你可能会因为某些原因需要在不同的版本之间切换...手动管理比卸载等操作要容易得多... - Asqan

12

我认为在新的Node.js更新后,我们遇到这个错误有两种解决方法。

  1. Downgrade Node.js

  2. node_modules\react-scripts\config\webpack.config.js - you should add this code inside the .js file you find here:

        const crypto = require("crypto");
        const crypto_orig_createHash = crypto.createHash;
        crypto.createHash = algorithm => crypto_orig_createHash(algorithm == "md4" ? "sha256" : algorithm);


没有任何降级/导出修复方法起作用!但是这个方法对我有效。我想我会暂时使用这个修复方法,直到重新安装我的操作系统(这是在我升级到Fedora 36之后发生的)。 - ctrleffive
第二个解决方案对我有用,第一个也可以,只是不要降级,这不是一个好主意。 - Arkil Shaikh
这第二个解决方案对我也起作用了,仅在Webpack中设置hash选项似乎不够,可能是因为scss也使用了该函数? - nathancahill

6

将其用作Vue.js 3和Node.js v17.0.1的构建命令:

cross-env NODE_OPTIONS='--openssl-legacy-provider' vue-cli-service build"

为什么要加双引号?(在结尾处。) - Peter Mortensen

5

Rajiv的方法 似乎是一个可行的解决方法,但在 Vue.js 中这个语法没有起作用。正确的做法是不使用关键字 "SET" :

  "scripts": {
    "serve": "NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve",
    "build": "NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service build",
    "test:unit": "NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service test:unit",
    "lint": "NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service lint"
  },

4

我已经通过控制面板卸载了我的Node.js版本17.0.1。

然后我从nodejs.org下载了Node.js版本16.13.1并进行了安装,这样React Native就可以正常启动和构建了。


关于“控制面板”:在Windows上吗? - Peter Mortensen

4

我在17.3.0版本中遇到过类似的问题。

  1. 我卸载了Node.js并安装了16.13.0版本,并重新启动了计算机。
  2. 在新终端中运行,问题得到解决。

1
这并没有提供对问题的答案。一旦你获得足够的声望,你就可以评论任何帖子,而不是提供不需要询问者澄清的答案。-【来自审核】 - bguiz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接