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. 推荐方案:更新依赖包(最安全)
首先尝试更新您的依赖包,这是最安全和推荐的解决方案:
# 更新所有依赖包
npm update
# 如果问题仍然存在,尝试强制修复安全漏洞
npm audit fix --force
对于使用 Yarn 的用户:
npm_config_yes=true npx yarn-audit-fix
# 或在 PowerShell 中
$env:npm_config_yes = 1; npx yarn-audit-fix
2. 更新特定框架的脚本
React 项目
更新 react-scripts
到版本 5 或更高版本:
npm update react-scripts --save
Vue.js 项目
在 vue.config.js
中添加以下代码:
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
中修改启动脚本:
"scripts": {
"serve": "vue-cli-service serve --openssl-legacy-provider"
}
Angular 项目
修改 package.json
中的启动脚本:
"scripts": {
"start": "set NODE_OPTIONS=--openssl-legacy-provider && ng serve -o"
}
3. Webpack 配置解决方案
在 Webpack 配置文件中更改哈希算法:
// webpack.config.js
module.exports = {
// ... 其他配置
output: {
// Webpack 5 使用
hashFunction: 'xxhash64',
// Webpack 4 使用
// hashFunction: 'sha256',
// hashDigest: 'base64'
}
};
4. 环境变量解决方案(临时方案)
如果您需要快速解决问题而不立即更新依赖,可以设置环境变量:
export NODE_OPTIONS=--openssl-legacy-provider
set NODE_OPTIONS=--openssl-legacy-provider
$env:NODE_OPTIONS = "--openssl-legacy-provider"
或在项目根目录创建 .npmrc
文件:
node-options="--openssl-legacy-provider"
5. 使用 Node.js 版本管理工具
如果上述方法都不适用,您可以暂时使用 Node.js 16(长期支持版本):
# 安装 nvm (Node Version Manager)
# 然后安装并使用 Node.js 16
nvm install 16
nvm use 16
对于 Windows 用户,可以使用 nvm-windows。
Docker 用户注意事项
如果您在 Docker 容器中运行项目,请确保使用 Node.js 16 基础镜像:
FROM node:16.*
# 而不是
# FROM node
总结
解决方案 | 推荐度 | 说明 |
---|---|---|
更新依赖包 | ⭐⭐⭐⭐⭐ | 最安全,修复根本问题 |
框架特定更新 | ⭐⭐⭐⭐ | 针对具体框架的解决方案 |
Webpack 配置修改 | ⭐⭐⭐ | 需要手动配置,但效果良好 |
环境变量设置 | ⭐⭐ | 临时解决方案,存在安全风险 |
降级 Node.js | ⭐ | 最后手段,不推荐长期使用 |
最佳实践
建议优先尝试更新依赖包和框架版本,这是最安全和长远的解决方案。仅在紧急情况下使用临时方案,并尽快迁移到支持的版本。
如果您在尝试这些解决方案后仍然遇到问题,建议检查特定依赖包的版本兼容性,或查看相关开源项目的 issue 跟踪器获取更多帮助。