错误信息
error:0308010C:digital envelope routines::unsupported
Node.js 17+ (OpenSSL 3) — code ERR_OSSL_EVP_UNSUPPORTED
含义
某段代码向 OpenSSL 3 请求的算法已不在其默认提供程序(provider)中——最典型的是 MD4,旧版 webpack 用它计算构建哈希。Node 17 改用了 OpenSSL 3,旧的摘要算法和加密算法被移到了单独的“legacy”提供程序中,而该提供程序默认是关闭的。这个错误指出的是机制(EVP,即数字信封层),而不是罪魁祸首——任何向 OpenSSL 3 请求已淘汰算法的地方都会出现同样的错误码,不过绝大多数情况都出自在 Node 17+ 上运行 webpack 这一组合。
原因
旧版构建工具请求 MD4
常见webpack 4 中 4.46 及更早的版本(以及锁定这些版本的工具——react-scripts 4、vue-cli 4、旧版 Angular)默认用 MD4 对模块做哈希。在 Node ≥17 上,构建的第一步就会因这个错误而终止。堆栈跟踪中通常能看到 webpack 内部的 createHash。webpack 4.47.0 加入了与 5.61 相同的回退机制,因此 webpack 4 的最后一个版本又能正常构建了。
应用代码使用了旧版原语
偶见直接调用 createHash("md4")、用 RC4/DES/Blowfish 调用 createCipheriv,或者依赖中有同样的调用。这些算法在密码学上已被攻破,是被有意移出默认提供程序的。
非常旧的 PKCS#12/密钥库文件
罕见用基于 RC2/RC4 的方案加密的旧 .p12/.pfx 文件,在基于 OpenSSL 3 的环境中加载时也会碰到同样的问题:不带 -legacy 的 openssl pkcs12 会报告这个错误码,并指出 RC2-40-CBC。Node 自身的 tls.createSecureContext() 也会拒绝同一个文件,但给出的是另一条消息:“Unsupported PKCS12 PFX data”。
修复方法
- 1.
升级工具链(真正的修复方法)
webpack ≥ 5.61(4.x 系列中为 4.47)在 OpenSSL 不再提供 MD4 时,会回退到 MD4 的 WASM 实现;react-scripts 5 已包含这一版本。这样做是消除问题,而不是掩盖问题。
bash npm install --save-dev webpack@latest # CRA projects: npm install --save-dev react-scripts@5 - 2.
权宜之计:启用 legacy 提供程序
在整个进程范围内重新启用 MD4 及同类算法。为了让今天的构建先跑通,这样做可以接受;但不要让它成为永久方案——它会把已被攻破的算法重新暴露给进程中的所有代码。
bash NODE_OPTIONS=--openssl-legacy-provider npm run build - 3.
在自己的代码中替换算法
如果只是做非密码学用途的指纹计算,任何现代摘要算法都可以;而任何验证签名的代码从一开始就不应该使用 MD4/MD5。
js // before: createHash("md4") import { createHash } from "node:crypto"; const digest = createHash("sha256").update(data).digest("hex");