我创建了默认的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天前遇到了这个问题,目前仍在处理。
这个答案是一个立即的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“正式”降级为过时。
危险
这个问题有30多个答案,大多数人建议要么把Node.js降级到v17之前,要么使用传统的SSL提供程序。这两种解决方案都是黑客攻击,使您的构建容易受到安全威胁。
错误原因
在Node.js v17中,Node.js开发人员关闭了SSL提供者中的一个安全漏洞。这个修复是一个破坏性的更改,与NPM中SSL包中的类似破坏性更改相对应。当您试图在Node.js v17或更高版本中使用SSL而不升级包中的SSL包时。Json,然后你会看到这个错误。
正确的(安全的)解决方案(适用于npm用户)
使用最新版本的Node.js,并使用带有安全补丁的最新包。
对于很多人来说,下面的命令可以解决这个问题:
npm audit fix --force
但是,请注意,对于复杂的构建,上面的命令将引入可能破坏构建的安全修复程序。
Yarn用户注意事项
正如一些评论者指出的那样,如果你使用Yarn而不是Npm,那么上述基于Npm的修复可能不适合你,或者可能会产生不完整的结果。我不使用纱线,所以不能帮助;然而,概念应该是一样的。
Webpack的一个不那么笨拙(也是正确的)的解决方案
在Webpack配置中,设置以下任意一个:
(见输出。hashFunction文档)
A. (Webpack v5)设置输出。hashFunction = 'xxhash64'。
B. (Webpack v4)这将取决于nodejs在你的系统上支持什么散列算法。您可以尝试的一些常见选项是输出。hashFunction = 'sha512'或输出。hashFunction = 'sha256'。
在Greg的回答中可以看到更多信息。