跳到主要内容
ecdsa.com
Node.js 17+ (OpenSSL 3)Node.js crypto 模块

错误信息

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 这一组合。

原因

修复方法

  1. 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. 2.

    权宜之计:启用 legacy 提供程序

    在整个进程范围内重新启用 MD4 及同类算法。为了让今天的构建先跑通,这样做可以接受;但不要让它成为永久方案——它会把已被攻破的算法重新暴露给进程中的所有代码。

    bash
    NODE_OPTIONS=--openssl-legacy-provider npm run build
  3. 3.

    在自己的代码中替换算法

    如果只是做非密码学用途的指纹计算,任何现代摘要算法都可以;而任何验证签名的代码从一开始就不应该使用 MD4/MD5。

    js
    // before: createHash("md4")
    import { createHash } from "node:crypto";
    const digest = createHash("sha256").update(data).digest("hex");

相关错误

浏览完整的签名错误库