Webpack 构建失败并显示 ERR_OSSL_EVP_UNSUPPORTED

Rya*_*ell 492 webpack

我遇到了一个 Webpack 构建过程突然中断的问题,导致以下错误......

\n
<s> [webpack.Progress] 10% building 0/1 entries 0/0 dependencies 0/0 modules\nnode:internal/crypto/hash:67\n  this[kHandle] = new _Hash(algorithm, xofLen);\n                  ^\n\nError: error:0308010C:digital envelope routines::unsupported\n    at new Hash (node:internal/crypto/hash:67:19)\n    at Object.createHash (node:crypto:130:10)\n    at BulkUpdateDecorator.hashFactory (/app/node_modules/webpack/lib/util/createHash.js:155:18)\n    at BulkUpdateDecorator.update (/app/node_modules/webpack/lib/util/createHash.js:46:50)\n    at OriginalSource.updateHash (/app/node_modules/webpack-sources/lib/OriginalSource.js:131:8)\n    at NormalModule._initBuildHash (/app/node_modules/webpack/lib/NormalModule.js:888:17)\n    at handleParseResult (/app/node_modules/webpack/lib/NormalModule.js:954:10)\n    at /app/node_modules/webpack/lib/NormalModule.js:1048:4\n    at processResult (/app/node_modules/webpack/lib/NormalModule.js:763:11)\n    at /app/node_modules/webpack/lib/NormalModule.js:827:5 {\n  opensslErrorStack: [ \'error:03000086:digital envelope routines::initialization error\' ],\n  library: \'digital envelope routines\',\n  reason: \'unsupported\',\n  code: \'ERR_OSSL_EVP_UNSUPPORTED\'\n}\ncommand terminated with exit code 1\n
Run Code Online (Sandbox Code Playgroud)\n

我尝试过谷歌搜索ERR_OSSL_EVP_UNSUPPORTED webpack,几乎没有产生任何有用的结果,但它确实突出了使用OpenSSL提供的 MD4 (显然已弃用?)来生成哈希值的问题。

\n

webpack.config.js代码如下:

\n
const path = require(\'path\');\nconst webpack = require(\'webpack\');\n\n/*\n * SplitChunksPlugin is enabled by default and replaced\n * deprecated CommonsChunkPlugin. It automatically identifies modules which\n * should be splitted of chunk by heuristics using module duplication count and\n * module category (i. e. node_modules). And splits the chunks\xe2\x80\xa6\n *\n * It is safe to remove "splitChunks" from the generated configuration\n * and was added as an educational example.\n *\n * https://webpack.js.org/plugins/split-chunks-plugin/\n *\n */\n\n/*\n * We\'ve enabled TerserPlugin for you! This minifies your app\n * in order to load faster and run less javascript.\n *\n * https://github.com/webpack-contrib/terser-webpack-plugin\n *\n */\n\nconst TerserPlugin = require(\'terser-webpack-plugin\');\n\nmodule.exports = {\n    mode: \'development\',\n    entry: \'./src/js/scripts.js\',\n\n    output: {\n        path: path.resolve(__dirname, \'js\'),\n        filename: \'scripts.js\'\n    },\n\n    devtool: \'source-map\',\n\n    plugins: [new webpack.ProgressPlugin()],\n\n    module: {\n        rules: []\n    },\n\n    optimization: {\n        minimizer: [new TerserPlugin()],\n\n        splitChunks: {\n            cacheGroups: {\n                vendors: {\n                    priority: -10,\n                    test: /[\\\\/]node_modules[\\\\/]/\n                }\n            },\n\n            chunks: \'async\',\n            minChunks: 1,\n            minSize: 30000,\n            name: \'true\'\n        }\n    }\n};\n
Run Code Online (Sandbox Code Playgroud)\n

如何将 Webpack 使用的哈希算法更改为其他算法?

\n

Jan*_*Jan 735

我能够通过以下方式修复它:

export NODE_OPTIONS=--openssl-legacy-provider
Run Code Online (Sandbox Code Playgroud)

sachaw 对Node.js v17.0.0 的评论 - 在开发模式下启动项目时出错 #30078

但他们说他们修复了它:ijjk 对Node.js v17.0.0 的评论 - 在开发模式下启动项目时出错 #30078

您好,Next.js 已更新至 v11.1.3-canary.89,请更新并尝试一下!

对我来说,它仅适用于上面的注释。

我还想指出,它npm run start适用于-openssl-legacy-provider,但npm run dev不适用于。

好像有补丁: Node.js 17: digital Enveloperoutines::unsupported #14532

我个人降级为16-alpine.

  • PowerShell: `$env:NODE_OPTIONS="--openssl-legacy-provider"` (84认同)
  • 您可以一次运行全部:`NODE_OPTIONS=--openssl-legacy-provider npm start` (17认同)
  • 在运行服务器之前: `"scripts": { "debug": "NODE_OPTIONS='--openssl-legacy-provider' next dev -p 5000"` (9认同)
  • 在 Fedora 36 上不适用于节点 `v16.14.0`:`node: --openssl-legacy-provider is not allowed in NODE_OPTIONS` (9认同)
  • 在带有 React 的 Windows 上,编辑 package.json ```json { "scripts": { "start": "set \"NODE_OPTIONS=--openssl-legacy-provider\" &amp;&amp; react-scripts start"}} ``` (4认同)
  • 所有这些关于降级或使用不安全选项的解决方案都是 hacky...16 将在一个月内退出 LTS,并且 Node 18 将不支持这些策略(即使它们确实有效),鉴于他们正在制作您的应用程序,因此应该强烈劝阻它们根据 OpenSSL 的定义,更容易受到攻击。 (3认同)

Ben*_*son 184

我也有这个问题。我不小心运行在最新的 Node.js(撰写本文时为 17.0),而不是我想要安装的 LTS 版本(14.18)。将我的 Node.js 安装降级到 LTS 版本解决了我的问题。

  • 同样在这里。降级到 16.x 也有效。根据 https://nodejs.org/en/about/releases/,它的 LTS 将在一周内(2021-10-26)开始,所以我就这么做了。 (22认同)
  • 确认从 v17.2.0 降级到 v16.13.1 工作正常 (6认同)
  • 谢谢。通过 [nvm](https://github.com/nvm-sh/nvm) 或 [nvm-windows](https://github.com/coreybutler/nvm-windows) 的节点版本管理器非常适合在版本之间轻松切换 (4认同)
  • 我在 v16.13.0 中遇到这个问题。 (3认同)

小智 80

这实际上不是我的答案,但我发现了这个解决方法 /hack/ 来解决我的问题代码签入 GitHub 项目...请参阅此处的错误评论。

使用npm install更新后,我遇到了 ERR_OSSL_EVP_UNSUPPORTED 。

我将以下内容添加到 node_modules\react-scripts\config\webpack.config.js

const crypto = require("crypto");
const crypto_orig_createHash = crypto.createHash;
crypto.createHash = algorithm => crypto_orig_createHash(algorithm == "md4" ? "sha256" : algorithm);
Run Code Online (Sandbox Code Playgroud)

我尝试了Ryan Brownell 的解决方案,但最终出现了不同的错误,但这有效......


打字稿等效:

import crypto from "crypto";

const crypto_orig_createHash = crypto.createHash;
Object.assign(crypto, {
  createHash: (algorithm: string): crypto.Hash => crypto_orig_createHash(algorithm === "md4" ? "sha256" : algorithm),
});
Run Code Online (Sandbox Code Playgroud)

  • 这应该是 2021 年接受的答案。也感谢您描述文件的文件夹位置。它解决了我的问题。我之前尝试过将变量导出到环境的解决方案,但它导致 VSCode 不再加载。所以这可以解决这个问题,而不会影响其他程序。 (2认同)

jbg*_*jbg 67

如果您使用 Webpack v5.54.0+,Ryan Brownell 的答案是理想的解决方案。

\n

如果您使用的是较旧版本的 Webpack,您仍然可以通过将哈希函数更改为未弃用的函数来解决此问题。(它默认为古老的md4,OpenSSL 已删除了对它的支持,这是错误的根本原因。)支持的算法是crypto.createHash支持的任何算法。例如,要使用SHA-256

\n
module.exports = {\n    output: {\n        hashFunction: "sha256"\n    }\n};\n
Run Code Online (Sandbox Code Playgroud)\n

最后,如果您无法更改 Webpack 配置(例如,如果它是运行 Webpack 的传递依赖项),您可以启用 OpenSSL 的旧版提供程序以在 Webpack 构建期间临时启用 MD4。这是最后的手段。创建一个包含以下内容的文件openssl.cnf\xe2\x80\xa6

\n
openssl_conf = openssl_init\n\n[openssl_init]\nproviders = provider_sect\n\n[provider_sect]\ndefault = default_sect\nlegacy = legacy_sect\n\n[default_sect]\nactivate = 1\n\n[legacy_sect]\nactivate = 1\n
Run Code Online (Sandbox Code Playgroud)\n

\xe2\x80\xa6,然后在运行 Webpack 时将环境变量设置OPENSSL_CONF为该文件的路径。

\n

  • 事实证明,“hashFunction”修复可以提供帮助。但这可能还不够:Webpack 4.x 中的 ConcatenatedModule 优化器 [硬编码 MD4 的使用](https://github.com/webpack/webpack/blob/3956274f1eada621e105208dcab4608883cdfdb2/lib/optimize/ConcatenatedModule.js#L563),所以如果您的构建过程使用它,您可能需要走“openssl.cnf”路线。我认为这可能是 Vue CLI 4.x 项目的一般情况。 (10认同)

Rya*_*ell 64

Webpack v5.54.0+ 附带了一个不依赖 OpenSSL 的哈希算法。

要使用依赖于 npm 提供的依赖项而不是操作系统提供的依赖项的哈希函数,请修改 webpack.config.cjsoutput键以包含该hashFunction: "xxhash64"选项。

module.exports = {
    output: {
        hashFunction: "xxhash64"
    }
};
Run Code Online (Sandbox Code Playgroud)

  • 我收到“错误:不支持摘要方法” (26认同)
  • 同意。webpack 升级解决了我的问题。我使用的是 React 17,然后升级到 React 18,这确实给我带来了 webpack 5.74.0 =&gt; 问题解决了。 (4认同)
  • 如果您在 webpack 5.54+ 和 Node 17+ 上仍然遇到此错误,请查看堆栈跟踪。就我而言,“babel-loader: 8.2.2”还使用了已弃用的哈希函数。升级到“babel-loader: 8.3.0”解决了这个问题。 (2认同)

小智 27

Node.js 17.0.0 的发行说明中提到了此错误,并提供了建议的解决方法:

\n
\n

如果您在使用 Node.js 17 的应用程序中遇到ERR_OSSL_EVP_UNSUPPORTED错误,则您的应用程序或您正在使用的模块可能正在尝试使用不再适用的算法或密钥大小。 OpenSSL 3.0 默认允许。添加了命令行选项--openssl-legacy-provider来恢复到旧版提供程序,作为这些严格限制的临时解决方法。

\n
\n

  • @Cesarvspr,您必须将其添加到环境变量中,而不是作为“npm”命令的参数。`NODE_OPTIONS='--openssl-legacy-provider' npm run build` (6认同)
  • 我没在这里工作。:( NODE_OPTIONS 中不允许 --openssl-legacy-provider (4认同)

小智 23

我面临着同样的挑战,但您只需将 Node.js 降级到版本 16.13 即可,一切正常。下载 LTS,而不是下载中的最新版本。


小智 22

我使用Laravel Mix (Webpack)遇到了这个问题,并能够通过在脚本开头添加(在Jan 的回答中引用)来修复文件package.json中的问题:NODE_OPTIONS=--openssl-legacy-provider

package.json:

{
  "private": true,
  "scripts": {
    "production": "cross-env NODE_ENV=production NODE_OPTIONS=--openssl-legacy-provider  node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"
  },
  "dependencies": {
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)


小智 21

尝试将您的 Webpack 版本升级到 5.62.2。


小智 12

我在使用Next.js开发的项目中遇到了同样的问题。对于解决方案,我按如下方式运行项目并解决了问题。

cross-env NODE_OPTIONS='--openssl-legacy-provider' next dev
Run Code Online (Sandbox Code Playgroud)


dev*_*996 10

我的Vue.js项目遇到了同样的问题,我解决了。

macOS 和 Linux

  1. 您应该已经安装了NVM(节点版本管理器)。如果您以前从未使用过,只需在终端中运行以下命令:

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash

  1. 打开你的项目

  2. 在您的项目中打开终端

  3. 运行命令nvm install 16.13.0或任何旧版本

  4. 安装完成后,运行nvm use 16.13.0

  • 这不是问题的解决方案,只是一种解决方法。 (6认同)