Skip to content

error:0308010C 数字信封例程不支持错误解决方案

问题概述

当您在 Node.js 17 或更高版本中运行某些项目(特别是使用 Webpack、React、Vue.js 或 Angular 的项目)时,可能会遇到以下错误:

Error: error:0308010C:digital envelope routines::unsupported
    at new Hash (node:internal/crypto/hash:67:19)
    at Object.createHash (node:crypto:130:10)

这个错误通常发生在创建 React 项目、Vue.js 项目或其他使用 Webpack 构建工具的项目时。

错误原因

此错误的原因是 Node.js 17+ 版本中移除了对不安全的 SSL 算法的支持,而一些较旧版本的构建工具(如 Webpack 4)仍然依赖这些过时的算法(如 MD4)。

安全警告

请注意,使用临时解决方案(如降级 Node.js 或启用旧版 SSL 提供程序)会使您的构建易受安全威胁。这些方案应仅作为临时措施,直到您能够实施正确的修复。

解决方案

1. 推荐方案:更新依赖包(最安全)

首先尝试更新您的依赖包,这是最安全和推荐的解决方案:

bash
# 更新所有依赖包
npm update

# 如果问题仍然存在,尝试强制修复安全漏洞
npm audit fix --force

对于使用 Yarn 的用户:

bash
npm_config_yes=true npx yarn-audit-fix
# 或在 PowerShell 中
$env:npm_config_yes = 1; npx yarn-audit-fix

2. 更新特定框架的脚本

React 项目

更新 react-scripts 到版本 5 或更高版本:

bash
npm update react-scripts --save

Vue.js 项目

vue.config.js 中添加以下代码:

javascript
const crypto = require('crypto');

try {
  crypto.createHash('md4');
} catch (e) {
  console.warn('Crypto "MD4" is not supported anymore by this Node.js version');
  const origCreateHash = crypto.createHash;
  crypto.createHash = (alg, opts) => {
    return origCreateHash(alg === 'md4' ? 'md5' : alg, opts);
  };
}

或者在 package.json 中修改启动脚本:

json
"scripts": {
  "serve": "vue-cli-service serve --openssl-legacy-provider"
}

Angular 项目

修改 package.json 中的启动脚本:

json
"scripts": {
  "start": "set NODE_OPTIONS=--openssl-legacy-provider && ng serve -o"
}

3. Webpack 配置解决方案

在 Webpack 配置文件中更改哈希算法:

javascript
// webpack.config.js
module.exports = {
  // ... 其他配置
  output: {
    // Webpack 5 使用
    hashFunction: 'xxhash64',
    // Webpack 4 使用
    // hashFunction: 'sha256',
    // hashDigest: 'base64'
  }
};

4. 环境变量解决方案(临时方案)

如果您需要快速解决问题而不立即更新依赖,可以设置环境变量:

bash
export NODE_OPTIONS=--openssl-legacy-provider
cmd
set NODE_OPTIONS=--openssl-legacy-provider
powershell
$env:NODE_OPTIONS = "--openssl-legacy-provider"

或在项目根目录创建 .npmrc 文件:

node-options="--openssl-legacy-provider"

5. 使用 Node.js 版本管理工具

如果上述方法都不适用,您可以暂时使用 Node.js 16(长期支持版本):

bash
# 安装 nvm (Node Version Manager)
# 然后安装并使用 Node.js 16
nvm install 16
nvm use 16

对于 Windows 用户,可以使用 nvm-windows

Docker 用户注意事项

如果您在 Docker 容器中运行项目,请确保使用 Node.js 16 基础镜像:

dockerfile
FROM node:16.*
# 而不是
# FROM node

总结

解决方案推荐度说明
更新依赖包⭐⭐⭐⭐⭐最安全,修复根本问题
框架特定更新⭐⭐⭐⭐针对具体框架的解决方案
Webpack 配置修改⭐⭐⭐需要手动配置,但效果良好
环境变量设置⭐⭐临时解决方案,存在安全风险
降级 Node.js最后手段,不推荐长期使用

最佳实践

建议优先尝试更新依赖包和框架版本,这是最安全和长远的解决方案。仅在紧急情况下使用临时方案,并尽快迁移到支持的版本。

如果您在尝试这些解决方案后仍然遇到问题,建议检查特定依赖包的版本兼容性,或查看相关开源项目的 issue 跟踪器获取更多帮助。