Webpack构建失败,err_ossl_evp_不支持

我有一个Webpack构建过程突然崩溃的问题,导致以下错误…

<s> [webpack.Progress] 10% building 0/1 entries 0/0 dependencies 0/0 modules
node:internal/crypto/hash:67
this[kHandle] = new _Hash(algorithm, xofLen);
^


Error: error:0308010C:digital envelope routines::unsupported
at new Hash (node:internal/crypto/hash:67:19)
at Object.createHash (node:crypto:130:10)
at BulkUpdateDecorator.hashFactory (/app/node_modules/webpack/lib/util/createHash.js:155:18)
at BulkUpdateDecorator.update (/app/node_modules/webpack/lib/util/createHash.js:46:50)
at OriginalSource.updateHash (/app/node_modules/webpack-sources/lib/OriginalSource.js:131:8)
at NormalModule._initBuildHash (/app/node_modules/webpack/lib/NormalModule.js:888:17)
at handleParseResult (/app/node_modules/webpack/lib/NormalModule.js:954:10)
at /app/node_modules/webpack/lib/NormalModule.js:1048:4
at processResult (/app/node_modules/webpack/lib/NormalModule.js:763:11)
at /app/node_modules/webpack/lib/NormalModule.js:827:5 {
opensslErrorStack: [ 'error:03000086:digital envelope routines::initialization error' ],
library: 'digital envelope routines',
reason: 'unsupported',
code: 'ERR_OSSL_EVP_UNSUPPORTED'
}
command terminated with exit code 1

我尝试谷歌ERR_OSSL_EVP_UNSUPPORTED webpack,几乎没有产生有用的结果,但它确实突出了一个问题,使用MD4由OpenSSL提供(这显然是不赞成的?)来生成哈希。

webpack.config.js代码如下:

const path = require('path');
const webpack = require('webpack');


/*
* SplitChunksPlugin is enabled by default and replaced
* deprecated CommonsChunkPlugin. It automatically identifies modules which
* should be splitted of chunk by heuristics using module duplication count and
* module category (i. e. node_modules). And splits the chunks…
*
* It is safe to remove "splitChunks" from the generated configuration
* and was added as an educational example.
*
* https://webpack.js.org/plugins/split-chunks-plugin/
*
*/


/*
* We've enabled TerserPlugin for you! This minifies your app
* in order to load faster and run less javascript.
*
* https://github.com/webpack-contrib/terser-webpack-plugin
*
*/


const TerserPlugin = require('terser-webpack-plugin');


module.exports = {
mode: 'development',
entry: './src/js/scripts.js',


output: {
path: path.resolve(__dirname, 'js'),
filename: 'scripts.js'
},


devtool: 'source-map',


plugins: [new webpack.ProgressPlugin()],


module: {
rules: []
},


optimization: {
minimizer: [new TerserPlugin()],


splitChunks: {
cacheGroups: {
vendors: {
priority: -10,
test: /[\\/]node_modules[\\/]/
}
},


chunks: 'async',
minChunks: 1,
minSize: 30000,
name: 'true'
}
}
};

我如何改变哈希算法使用的Webpack其他的东西?

248048 次浏览

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

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

module.exports = {
output: {
hashFunction: "xxhash64"
}
};

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

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

module.exports = {
output: {
hashFunction: "sha256"
}
};

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

openssl_conf = openssl_init


[openssl_init]
providers = provider_sect


[provider_sect]
default = default_sect
legacy = legacy_sect


[default_sect]
activate = 1


[legacy_sect]
activate = 1

然后将环境变量OPENSSL_CONF设置为运行Webpack时该文件的路径。

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

此错误在Node.js 17.0.0的发布说明中提到,并有一个建议的解决方案:

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

这不是我的答案,但我发现这个变通/黑客/解决我的问题代码检入一个GitHub项目…参见bug注释在这里

在使用npm安装更新后,我遇到了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);

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

我也遇到过同样的挑战,但你只需要把Node.js降级到16.13版本,一切就都可以正常工作了。下载LTS,而不是当前的下载

我可以通过以下方法修复它:

export NODE_OPTIONS=--openssl-legacy-provider

sachaw's comment to Node.js v17.0.0 -错误启动项目在开发模式#30078

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

您好,这已在v11.1.3-canary中更新。89的Next.js,请更新并尝试!

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

我还想指出,npm run start可以与-openssl-legacy-provider一起工作,但npm run dev不行。

似乎有一个补丁: Node.js 17:数字信封例程::不支持#14532 < / em >

我个人降级为16-alpine

我有同样的问题与我的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命令

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

< >强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": {
...
}
}

试着升级你的Webpack版本到5.62.2。

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

cross-env NODE_OPTIONS='--openssl-legacy-provider' next dev

这意味着你拥有最新的Node.js版本。如果你正在为码头工人使用它,那么你需要从

FROM node

FROM node:14