元数据
| id | npm-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)