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 应用程序遇到了同样的问题 -

  1. 我刚刚在本地将 Node.js 版本降级到 14
  2. Docker image replaced with version 14.18.1. Earlier it was Alpine Linux

您可以在 Node.js 的最新版本文档中找到更多详细信息。

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

  1. 降级Node.js

  2. 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 版本中遇到过类似的问题

  1. 我卸载了Node.js安装了版本到16.13.0重启
  2. 通过 运行 在新终端中修复

将其用作 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 在节点版本之间切换,我这样做了并且反应很好