Node.js 17.0.1 盖茨比错误 - "digital envelope routines::unsupported ... ERR_OSSL_EVP_UNSUPPORTED"
Node.js 17.0.1 Gatsby error - "digital envelope routines::unsupported ... ERR_OSSL_EVP_UNSUPPORTED"
我正在构建一个 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: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt #48
Gatsby 必须使用 OpenSSL 3.0 默认不再允许的 algorithm or key size。
UPDATE ⚠️
This is most likely a webpack issue - https://github.com/webpack/webpack/issues/14532
They have since released a fix in version 5.61.0 - https://github.com/webpack/webpack/releases/tag/v5.61.0 - so upgrading webpack should address the issue as well
A member of the webpack team has stated they do not plan to backport the fix to webpack 4, so if you are on webpack 4 you may need to look to upgrading to webpack 5 first.
来自Node.js 17's announcement post:
If you hit an ERR_OSSL_EVP_UNSUPPORTED
error in your application with Node.js 17, it’s likely that your application or a module you’re using is attempting to use an algorithm or key size which is no longer allowed by default with OpenSSL 3.0. A new command-line option, --openssl-legacy-provider
, has been added to revert to the legacy provider as a temporary workaround for these tightened restrictions.
运行 这在终端上可能看起来像:
node --openssl-legacy-provider ./node_modules/.bin/gatsby build
您也可以通过 NODE_OPTIONS 环境变量传递它。
因此,如果您想继续使用 NPM 脚本,可以将 build
脚本更改为:
// package.json
{
"scripts": {
"build": "export NODE_OPTIONS=--openssl-legacy-provider; gatsby build"
}
}
我也遇到了同样的问题,所以直接降级了Node.js版本:
卸载Node.js
然后下载安装16.13.0.
这可能会有所帮助。在 package.json 文件中添加这些脚本。
反应:
"scripts": {
"start": "export SET NODE_OPTIONS=--openssl-legacy-provider && react-scripts start",
"build": "export 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"
},
或
"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"
},
seems right as a workaround, but the syntax didn't worked for me in 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"
},
我在服务器上的 Angular 应用程序遇到了同样的问题 -
- 我刚刚在本地将 Node.js 版本降级到 14
- Docker image replaced with version 14.18.1. Earlier it was Alpine Linux
您可以在 Node.js 的最新版本文档中找到更多详细信息。
我认为我们在新 Node.js 更新后遇到的这个错误有两种解决方案。
降级Node.js
node_modules\react-scripts\config\webpack.config.js - 您应该在此处找到的 .js 文件中添加此代码:
const crypto = require("crypto");
const crypto_orig_createHash = crypto.createHash;
crypto.createHash = algorithm => crypto_orig_createHash(algorithm == "md4" ? "sha256" : algorithm);
此问题随 Node.js17 的新更新一起出现。
在 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"
}
快速修复:运行 在您的 React 项目中的终端中。
export NODE_OPTIONS=--openssl-legacy-provider
我已经通过控制面板卸载了我的 Node.js 版本 17.0.1。
然后我从 nodejs.org 下载了 Node.js 版本 16.13.1 并安装了它,然后 React Native 启动并正常构建。
我在 17.3.0 版本中遇到过类似的问题
- 我卸载了Node.js安装了版本到16.13.0重启
- 通过 运行 在新终端中修复
将其用作 Vue 3 和节点 v17.0.1 的构建命令:
cross-env NODE_OPTIONS='--openssl-legacy-provider' vue-cli-service build"
虽然使用 --openssl-legacy-provider
进行修补更像是一种 hack,真正的解决方案是修复 Vue/React/... 中的 OpenSSL 密钥大小使用;暂时的解决方法可能确实是使用旧版本的 Node。但我建议不要降级 Node;而是安装 NVM(main/win: nvm-windows/nodist/nvs,最后一个是 cross-platform)并按需在版本之间切换。
我认为你应该降级你的节点或使用 nvm 在节点版本之间切换,我这样做了并且反应很好
我正在构建一个 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: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt #48
Gatsby 必须使用 OpenSSL 3.0 默认不再允许的 algorithm or key size。
UPDATE ⚠️
This is most likely a webpack issue - https://github.com/webpack/webpack/issues/14532
They have since released a fix in version 5.61.0 - https://github.com/webpack/webpack/releases/tag/v5.61.0 - so upgrading webpack should address the issue as well
A member of the webpack team has stated they do not plan to backport the fix to webpack 4, so if you are on webpack 4 you may need to look to upgrading to webpack 5 first.
来自Node.js 17's announcement post:
If you hit an
ERR_OSSL_EVP_UNSUPPORTED
error in your application with Node.js 17, it’s likely that your application or a module you’re using is attempting to use an algorithm or key size which is no longer allowed by default with OpenSSL 3.0. A new command-line option,--openssl-legacy-provider
, has been added to revert to the legacy provider as a temporary workaround for these tightened restrictions.
运行 这在终端上可能看起来像:
node --openssl-legacy-provider ./node_modules/.bin/gatsby build
您也可以通过 NODE_OPTIONS 环境变量传递它。
因此,如果您想继续使用 NPM 脚本,可以将 build
脚本更改为:
// package.json
{
"scripts": {
"build": "export NODE_OPTIONS=--openssl-legacy-provider; gatsby build"
}
}
我也遇到了同样的问题,所以直接降级了Node.js版本:
卸载Node.js
然后下载安装16.13.0.
这可能会有所帮助。在 package.json 文件中添加这些脚本。
反应:
"scripts": {
"start": "export SET NODE_OPTIONS=--openssl-legacy-provider && react-scripts start",
"build": "export 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"
},
或
"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"
},
"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"
},
我在服务器上的 Angular 应用程序遇到了同样的问题 -
- 我刚刚在本地将 Node.js 版本降级到 14
- Docker image replaced with version 14.18.1. Earlier it was Alpine Linux
您可以在 Node.js 的最新版本文档中找到更多详细信息。
我认为我们在新 Node.js 更新后遇到的这个错误有两种解决方案。
降级Node.js
node_modules\react-scripts\config\webpack.config.js - 您应该在此处找到的 .js 文件中添加此代码:
const crypto = require("crypto"); const crypto_orig_createHash = crypto.createHash; crypto.createHash = algorithm => crypto_orig_createHash(algorithm == "md4" ? "sha256" : algorithm);
此问题随 Node.js17 的新更新一起出现。 在 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"
}
快速修复:运行 在您的 React 项目中的终端中。
export NODE_OPTIONS=--openssl-legacy-provider
我已经通过控制面板卸载了我的 Node.js 版本 17.0.1。
然后我从 nodejs.org 下载了 Node.js 版本 16.13.1 并安装了它,然后 React Native 启动并正常构建。
我在 17.3.0 版本中遇到过类似的问题
- 我卸载了Node.js安装了版本到16.13.0重启
- 通过 运行 在新终端中修复
将其用作 Vue 3 和节点 v17.0.1 的构建命令:
cross-env NODE_OPTIONS='--openssl-legacy-provider' vue-cli-service build"
虽然使用 --openssl-legacy-provider
进行修补更像是一种 hack,真正的解决方案是修复 Vue/React/... 中的 OpenSSL 密钥大小使用;暂时的解决方法可能确实是使用旧版本的 Node。但我建议不要降级 Node;而是安装 NVM(main/win: nvm-windows/nodist/nvs,最后一个是 cross-platform)并按需在版本之间切换。
我认为你应该降级你的节点或使用 nvm 在节点版本之间切换,我这样做了并且反应很好