我创建了默认的IntelliJ IDEA React项目,并得到了这个:

Error: error:0308010C:digital envelope routines::unsupported
    at new Hash (node:internal/crypto/hash:67:19)
    at Object.createHash (node:crypto:130:10)
    at module.exports (/Users/user/Programming Documents/WebServer/untitled/node_modules/webpack/lib/util/createHash.js:135:53)
    at NormalModule._initBuildHash (/Users/user/Programming Documents/WebServer/untitled/node_modules/webpack/lib/NormalModule.js:417:16)
    at handleParseError (/Users/user/Programming Documents/WebServer/untitled/node_modules/webpack/lib/NormalModule.js:471:10)
    at /Users/user/Programming Documents/WebServer/untitled/node_modules/webpack/lib/NormalModule.js:503:5
    at /Users/user/Programming Documents/WebServer/untitled/node_modules/webpack/lib/NormalModule.js:358:12
    at /Users/user/Programming Documents/WebServer/untitled/node_modules/loader-runner/lib/LoaderRunner.js:373:3
    at iterateNormalLoaders (/Users/user/Programming Documents/WebServer/untitled/node_modules/loader-runner/lib/LoaderRunner.js:214:10)
    at iterateNormalLoaders (/Users/user/Programming Documents/WebServer/untitled/node_modules/loader-runner/lib/LoaderRunner.js:221:10)
/Users/user/Programming Documents/WebServer/untitled/node_modules/react-scripts/scripts/start.js:19
  throw err;
  ^

这似乎是最近才出现的问题——webpack在4天前遇到了这个问题,目前仍在处理。


当前回答

你可以试试其中的一种:

1. 降级到Node.js v16。

您可以从Node.js的网站重新安装当前的LTS版本。 你也可以使用nvm。对于Windows,请使用vvm - Windows。

2. 启用旧的OpenSSL提供程序。

在类unix (Linux, macOS, Git bash等)上:

export NODE_OPTIONS=--openssl-legacy-provider

在Windows命令提示符中:

set NODE_OPTIONS=--openssl-legacy-provider

PowerShell:

$env:NODE_OPTIONS = "--openssl-legacy-provider"

参考

其他回答

我也犯了同样的错误。

我的情况:

安装了新的react typescript应用程序,添加了一些scss和一些组件。

在本地我的构建是工作的,但当我试图发布它失败与错误:

Error: error:0308010C:digital envelope routines::unsupported

我通过将react-script库更新到5.0.1来修复这个问题

"react-scripts": "^5.0.1",

这个答案是一个立即的OpenSSL系统级解决方案,而不涉及以前工作的构建配置。

在理想的情况下,你有时间升级和迁移不安全的构建依赖项,并确保你没有破坏应用程序中的其他东西(或者完全避免webpack,或者在我的例子中从vue-cli迁移到使用esbuild的vite)。

相反,你“应该”(a)告诉webpack使用一个更新的哈希函数,或者(b)用npm审计减轻违规包。


系统级OpenSSL解决方案

最快的解决方法是通过在系统范围的OpenSSL配置中启用“遗留的”加密提供者来临时重新启用MD4。

这是非常不安全和笨拙的。然后,您应该禁用遗留的加密方法。

(不幸的是,下面的测试只适用于Linux)。

Backup your existing OpenSSL configuration: sudo cp /etc/ssl/openssl.cnf /etc/ssl/openssl.cnf.BAK Append (or uncomment) the following configuration to enable the legacy "providers" (as OpenSSL calls them). You probably want to sudo vim /etc/ssl/openssl.cnf or similar. [provider_sect] default = default_sect legacy = legacy_sect [default_sect] activate = 1 [legacy_sect] activate = 1 Rerun your node script as before. Disable the legacy providers afterwards. sudo mv -f /etc/ssl/openssl.cnf.BAK /etc/ssl/openssl.cnf

这个解决方案来自于一个类似问题的答案。


深层原因是什么?

Node在*nix系统上使用OpenSSL作为哈希函数和加密。最新版本的OpenSSL默认禁用MD4——这将破坏任何以前使用MD4的工作程序。考虑到这一点,任何认为使用MD4进行文件哈希是一个“好主意”的npm包现在都被破坏了——即使MD4自1996年以来就被RSA实验室认为是破坏的!MD4也在2011年被RFC 6150“正式”降级为过时。

在使用VueJS时遇到了这个问题。

使用-openssl-legacy-provider的一个缺点是旧版本的Node不支持它。当提供此标志时,旧版本的Node根本不运行。 但我仍然希望与Node v16及更早版本兼容。

VueJS使用md4算法来生成散列(实际上它是WebPack的底层)。出于这些目的,md5可以很容易地取代Md4。所使用的算法类型,在大多数地方都是硬编码的,所以没有办法配置另一种算法。

所以我想出了另一个变通办法。从crypto模块拦截原始createHash()调用并将其替换为修改后的版本的函数。这是vue.config.js文件的开头:

const crypto = require('crypto');

/**
 * md4 algorithm is not available anymore in NodeJS 17+ (because of lib SSL 3).
 * In that case, silently replace md4 by md5 algorithm.
 */
try {
  crypto.createHash('md4');
} catch (e) {
  console.warn('Crypto "md4" is not supported anymore by this Node version');
  const origCreateHash = crypto.createHash;
  crypto.createHash = (alg, opts) => {
    return origCreateHash(alg === 'md4' ? 'md5' : alg, opts);
  };
}

我在vue js项目中也遇到了同样的问题。我所做的是从机器上卸载node js的新版本(>18),并安装以前的版本(v16.14.2)。它的工作原理

这在我的应用博览会上很管用(从Node.js 17降级到Node.js 12或14)。

如果你安装了nvm,你可以改变node的版本:

首先在nvm中检查Node.js的版本:

nvm list

其次,安装版本12或14:

nvm install v12.22.8