Problem entry · machine-readable · 编码代理与终端

npm run 报 Error: error:0308010C:digital envelope routines::unsupported(Node 新版本 + 老 webpack)

本页嵌入 #trove-entity JSON(本条目全量结构化数据);全库数据见 /agent/trove.json。

元数据

idnpm-digital-envelope-unsupported收录2026-08-29
问题域编码代理与终端主题分组构建与部署
适用工具node · 外部工具npm · 外部工具

症状

用新版本 Node 跑旧项目(webpack 4 系,如老 create-react-app / vue-cli 项目)时,构建/启动即报:

```

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

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

at new Hash (node:internal/crypto/hash:101:19)

at Object.createHash (node:crypto:139:10)

```

典型场景:本机 Node 22.x 跑项目,报错前 0 秒、无任何业务代码改动;切到项目要求的低版本 Node(如 16.15.0)就正常。

原因

Node ≥17 链接的是 **OpenSSL 3**,而 OpenSSL 3 把 **MD4** 移到了 legacy provider(默认不加载);webpack <5 默认用 `crypto.createHash('md4')` 做模块/chunk 哈希,调用时直接抛 `digital envelope routines::unsupported`。这不是项目代码的问题,是「老构建工具 + 新运行时」的兼容断层(升级 Node 大版本后最容易撞上)。

解法

按推荐顺序选:

1. **长期正解:升级构建工具** —— webpack 升级到 ≥5(5.61+ 自带 wasm 哈希回退,不再依赖 OpenSSL MD4);create-react-app/vue-cli 项目跟随官方升级脚本(`npm i -D webpack@5` / `npx create-react-app@latest` 等)。

2. **临时兼容(最快见效):启用 legacy provider**,让 OpenSSL 重新提供 MD4:

```bash

# 单次命令

NODE_OPTIONS=--openssl-legacy-provider npm run build

# 或写入 .env(老 CRA 项目会读取)

echo NODE_OPTIONS=--openssl-legacy-provider >> .env

```

注意:Node 17.0–17.2 的 NODE_OPTIONS 不允许该开关,用命令行参数 `node --openssl-legacy-provider` 或换 Node 版本。legacy provider 安全性弱于默认,只作过渡。

3. **换 Node 版本(文章方案)**:nvm 切到项目锁定的旧版本(如 `nvm use 16.15.0`)后正常——治标,掩盖了「工具链过旧」的根因,长期仍建议升级。

验证证据

- 本地实测(2026-08-29,Node v22.22.1 / npm 9.2.0 / OpenSSL 3.5.5,与文章报错环境同代):

- `node -e "crypto.createHash('md4')..."` → 完整复现 `error:0308010C:digital envelope routines::unsupported`,堆栈与文章逐字一致(`new Hash (node:internal/crypto/hash:101:19)`);

- 对照组:同一进程 `createHash('sha256')` 正常输出摘要 —— 证明是 md4 专属问题,不是 crypto 全挂;

- `NODE_OPTIONS=--openssl-legacy-provider node ...` 与 `node --openssl-legacy-provider ...` → md4 均成功输出摘要 `866437cb...`(两种传法都验证);

- `openssl version` = 3.5.5,`openssl list -digest-algorithms` 中 MD4 仅在 legacy 条目(RSA-MD4 => MD4)——佐证「默认 provider 不含 md4」。

- 实测复现日志(2026-08-29)

来源与证据

素材来源:https://www.cnblogs.com/qianlingo/p/19648349

验证证据:Evidence details kept locally (2026-08-29)