Webpack 构建失败并出现 ERR_OSSL_EVP_UNSUPPORTED

Posted

技术标签:

【中文标题】Webpack 构建失败并出现 ERR_OSSL_EVP_UNSUPPORTED【英文标题】:Webpack build failing with ERR_OSSL_EVP_UNSUPPORTED [duplicate] 【发布时间】:2021-12-07 01:51:27 【问题描述】:

我遇到了一个 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 几乎没有产生任何有用的结果,但它确实突出了使用 OpenSSL 提供的 MD4 生成哈希的问题(这显然已被弃用?)。

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 使用的哈希算法更改为其他算法?

【问题讨论】:

github.com/facebook/create-react-app/issues/11562 有详细信息,为什么要将 NodeJs 降级到 v16.13.0 【参考方案1】:

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

【讨论】:

这里也一样。降级到 16.x 也有效。根据nodejs.org/en/about/releases,它的 LTS 将在一周内(2021-10-26)开始,所以我去了。 我在使用 v16.13.0 时遇到了这个问题。 谢谢。它在这里工作。我使用“asdf”在项目中本地运行 LTS 版本。 github.com/facebook/create-react-app/issues/11562 有详细信息,为什么要将 NodeJs 降级到 v16.13.0 @Trip 检查你的 package.json 是否有 ReactNative。问一个问题。【参考方案2】:

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

export NODE_OPTIONS=--openssl-legacy-provider

sachaw's comment to Node.js v17.0.0 - Error starting project in development mode #30078

但他们说他们修好了:ijjk's comment to Node.js v17.0.0 - Error starting project in development mode #30078:

您好,Next.js的v11.1.3-canary.89已经更新,请更新试试看!

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

我还想指出 npm run start-openssl-legacy-provider 一起使用,但 npm run dev 不会。

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

我个人降级为16-alpine

【讨论】:

它工作!导出 NODE_OPTIONS=--openssl-legacy-provider PowerShell:$env:NODE_OPTIONS="--openssl-legacy-provider"【参考方案3】:

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

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

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

【讨论】:

【参考方案4】:

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

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

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

最后,如果您无法更改 Webpack 配置(例如,如果它是运行 Webpack 的传递依赖项),您可以启用 OpenSSL 的 legacy provider 在 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

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

【讨论】:

原来hashFunction 修复可以提供帮助。但它可能还不够:Webpack 4.x hardcodes the use of MD4 中的 ConcatenatedModule 优化器,所以如果你的构建过程使用它,你可能需要走 openssl.cnf 路线。我认为这可能是 Vue CLI 4.x 项目的一般情况。【参考方案5】:

Node.js 17.0.0 的 release notes 中提到了此错误,并提供了建议的解决方法:

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

【讨论】:

【参考方案6】:

这真的不是我的答案,但我找到了这个解决方法 /hack/ 来解决我的问题 Code Check in for a GitHub project...请参阅错误 cmets here。

我在使用 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);

我尝试了Ryan Brownell's solution,结果出现了另一个错误,但这有效...

【讨论】:

这在 Webpack4 中对我来说很好用。我在 12LTS / 17 之间弹跳,这可以节省大量时间。 这应该是 2021 年公认的答案。也感谢您描述文件的文件夹位置。它解决了我的问题。我之前尝试过将变量导出到环境的解决方案,它导致 VSCode 不再加载。因此,这可以解决它,而不会在全局范围内损害其他程序。 非常感谢这个修复工作!【参考方案7】:

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

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": 
    ...
  

【讨论】:

【参考方案8】:

我遇到了同样的挑战,但您只需将 node.js 降级到 16.13 版本,一切正常。在https://nodejs.org/en/download/上下载不是最新的LTS

【讨论】:

【参考方案9】:

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

【讨论】:

这应该被接受,升级 WebPack 为我解决了这个问题。谢谢!!【参考方案10】:

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

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

【讨论】:

【参考方案11】:

这意味着您拥有最新的 Node.js 版本。如果您将其用于Docker,则需要将图像从

FROM node

FROM node:14

【讨论】:

【参考方案12】:

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

macOS 和 Linux

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

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

    打开你的项目

    在你的项目中打开终端

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

    安装完成后,运行nvm use 16.13.0

【讨论】:

这不是解决问题的方法,只是一种解决方法。

以上是关于Webpack 构建失败并出现 ERR_OSSL_EVP_UNSUPPORTED的主要内容,如果未能解决你的问题,请参考以下文章

升级到 Vue 3 并将 Vue 实例化更新为 createApp 后,webpack 构建失败并出现 Module not found: Error: Can't resolve 'vue'

HandsonTable 中的 \9 是啥?构建失败并出现语法错误

构建失败并出现错误:未定义符号:___darwin_check_fd_set_overflow

如何让 webpack2 和 underscore-template loader + babel 工作而不会出现“模块构建失败:SyntaxError:'with' in strict mode (

Webpack 生产构建失败:“无法解析 'aws-sdk'”

模块解析失败:Webpack Typescript Loader 中出现意外的令牌