lavonXV 发表于 2024-5-26 12:59:29

Node.js项目 解决error:0308010C:digital envelope routines::unsupported 的方法

本帖最后由 lavonXV 于 2024-5-26 13:00 编辑

在使用 Node.js 开发项目时,您可能会遇到以下错误信息:

error:0308010C:digital envelope routines::unsupported

这个错误通常与 OpenSSL 配置有关,尤其是在升级到 Node.js 17 及更高版本时。本文将详细介绍该错误的原因,并提供多种解决方案,帮助您快速解决这一问题。

1. 错误原因

1.1 OpenSSL 的变化

从 Node.js 17 开始,默认使用 OpenSSL 3.0,而不是之前的 OpenSSL 1.1。OpenSSL 3.0 引入了很多变化,其中一些加密算法和协议在默认情况下不再支持,这可能导致某些依赖旧版 OpenSSL 的代码出现上述错误。

1.2 不支持的加密算法

在使用一些加密库或操作时,可能会调用到已经被弃用或不再默认支持的加密算法。这也是导致 `error:0308010C:digital envelope routines::unsupported` 错误的主要原因之一。

2. 解决方法

2.1 降级到 Node.js 16 或更低版本

最简单的解决方法是降级到 Node.js 16 或更低版本,因为这些版本使用的是 OpenSSL 1.1,不会出现上述错误。

(1) 使用 nvm(Node Version Manager)进行降级:


nvm install 16
nvm use 16


(2) 确认降级成功:


node -v


2.2 设置环境变量

如果希望继续使用 Node.js 17 或更高版本,可以通过设置环境变量来临时解决该问题。

(1) 在运行 Node.js 应用程序之前,设置以下环境变量:


export NODE_OPTIONS=--openssl-legacy-provider


(2) 或者在运行应用程序时直接指定环境变量:


NODE_OPTIONS=--openssl-legacy-provider node your-app.js


2.3 修改 package.json

为了在项目中永久解决该问题,可以在 `package.json` 中添加启动脚本,自动设置环境变量。

(1) 在 `package.json` 的 `scripts` 部分添加以下内容:


"scripts": {
"start": "NODE_OPTIONS=--openssl-legacy-provider node your-app.js"
}


(2) 这样在运行 `npm start` 时,环境变量会自动设置。

2.4 更新依赖库

有时候错误是由于某些依赖库不兼容 OpenSSL 3.0 引起的。检查并更新项目中的依赖库,确保它们都兼容最新的 Node.js 版本。

(1) 使用 npm 检查并更新依赖库:


npm outdated
npm update


(2) 确保更新后的依赖库没有新的兼容性问题。

2.5 检查自定义加密代码

如果项目中使用了自定义加密代码,确保这些代码兼容 OpenSSL 3.0。检查并更新加密算法和配置,避免使用已被弃用的算法。

(1) 查阅 OpenSSL 3.0 的官方文档,了解哪些算法和配置已被弃用。

(2) 更新代码中使用的加密算法,例如,从 MD4 算法切换到 SHA-256 算法。


const crypto = require('crypto');

// 更新前(可能导致错误)
const hash = crypto.createHash('md4').update('data').digest('hex');

// 更新后(兼容 OpenSSL 3.0)
const hash = crypto.createHash('sha256').update('data').digest('hex');


3. 总结

在使用 Node.js 17 及更高版本时,可能会遇到 `error:0308010C:digital envelope routines::unsupported` 错误。本文介绍了该错误的原因,并提供了五种解决方法:降级 Node.js 版本、设置环境变量、修改 `package.json`、更新依赖库以及检查自定义加密代码。根据实际情况选择合适的方法,可以快速解决这一问题,确保项目正常运行。

页: [1]
查看完整版本: Node.js项目 解决error:0308010C:digital envelope routines::unsupported 的方法