Skip to content

Node(v17+)报错Error:error:0308010C:digital envelope routines::unsupported

约 1031 字大约 3 分钟

Node

2025-01-20

Github Actions 部署 vuepress 项目报错:Error: error:0308010C:digital envelope routines::unsupported

问题

今天提交代码后发现Github Actions跑失败了!

$ vuepress build docs
wait Extracting site metadata...
tip Apply theme @vuepress/theme-default ...
tip Apply plugin container (i.e. "vuepress-plugin-container") ...
tip Apply plugin @vuepress/register-components (i.e. "@vuepress/plugin-register-components") ...
tip Apply plugin @vuepress/active-header-links (i.e. "@vuepress/plugin-active-header-links") ...
tip Apply plugin @vuepress/search (i.e. "@vuepress/plugin-search") ...
tip Apply plugin @vuepress/nprogress (i.e. "@vuepress/plugin-nprogress") ...
[info] [webpackbar] Compiling Client
[info] [webpackbar] Compiling Server
/home/runner/work/HulkPress/HulkPress/node_modules/loader-runner/lib/LoaderRunner.js:114
			throw e;
			^

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

原因

查询发现Error: error:0308010C:digital envelope routines::unsupported错误是因为 Node.js 17 及更高版本升级了 OpenSSL 3, 而OpenSSL3.0对允许算法和密钥大小增加了严格的限制,可能会对生态系统造成一些影响。

注意 现在高版本如Node.js 20好像没这个问题了,不知道是做了兼容还是怎么的。

验证

.yml中添加node -v查看GitHub Actions运行环境的node版本

Done in 23.40s.
v18.14.1
yarn run v1.22.19
$ vuepress build docs

可以看出在GitHub Actions设置的是Node.js v18.14.1

查看本地环境的node版本

$ node -v
v16.7.0

查看本地环境已下载的node版本

$ n ls
node/10.24.1
node/12.22.5
node/14.17.5
node/16.7.0

本地环境使用n下载node到对应版本。

$ n install 18.14.1
  installing : node-v18.14.1
       mkdir : /usr/local/n/versions/node/18.14.1
mkdir: /usr/local/n/versions/node/18.14.1: Permission denied

  Error: sudo required (or change ownership, or define N_PREFIX)

提示没权限,使用sudo再下一次

$ sudo n install 18.14.1
Password:
  installing : node-v18.14.1
       mkdir : /usr/local/n/versions/node/18.14.1
       fetch : https://nodejs.org/dist/v18.14.1/node-v18.14.1-darwin-x64.tar.xz
   installed : v18.14.1 (with npm 9.3.1)

使用n选择对应的版本切换

$ node -v
v18.14.1

本地编译项目

$ yarn run docs:dev
yarn run v1.22.11
$ vuepress dev docs
wait Extracting site metadata...
Error: The package "esbuild-darwin-64" could not be found, and is needed by esbuild.

由于我的项目是一个vuepress文档项目,没有引入其他三方包,所以我选择先更新一下vuepress

{
	"scripts": {
		"docs:dev": "vuepress dev docs",
		"docs:build": "vuepress build docs",
		"vuepress:deploy": "./deploy.sh"
	},
	"dependencies": {
		"vuepress": "^1.9.7"
	}
}

更新vuepress

$ pnpm up vuepress
....
dependencies:
- vuepress 1.9.7
+ vuepress 1.9.9

vuepress更新到了1.9.9。再次尝试启动本地服务

$ pnpm run docs:dev
...
node:internal/crypto/hash:71
  this[kHandle] = new _Hash(algorithm, xofLen);
                  ^

Error: error:0308010C:digital envelope routines::unsupported
...
{
  opensslErrorStack: [ 'error:03000086:digital envelope routines::initialization error' ],
  library: 'digital envelope routines',
  reason: 'unsupported',
  code: 'ERR_OSSL_EVP_UNSUPPORTED'
}

Node.js v18.14.1
 ELIFECYCLE  Command failed with exit code 1.

出现了相同的Error: error:0308010C:digital envelope routines::unsupported错误。

解决方案

通过上面的本地切换到相同的Node版本测试,我们确认了是node版本的问题。那么我们可以尝试以下几种解决方案。

  • 如果是本地则可以切换到没有问题的node版本
  • 设置NODE_OPTIONS=--openssl-legacy-provider
  • 指定低版本的node

切换低版本的Node

如果是本地的项目,我们可以方便的切换到低版本的Node。如使用nnvm来快速管理Node版本。

设置NODE_OPTIONS

通过设置NODE_OPTIONS=--openssl-legacy-provider 可以允许 Node.js 使用 OpenSSL 3 提供的旧版加密算法,从而确保不兼容的代码仍然可以正常运行。

Node设置NODE_OPTIONS

Linux & Mac OS命令行:

$ export NODE_OPTIONS=--openssl-legacy-provider

windows命令提示符:

$ set NODE_OPTIONS=--openssl-legacy-provider

项目设置NODE_OPTIONS

package.json中设置变量NODE_OPTIONS=--openssl-legacy-provider

先安装cross-env库用于设置变量。

{
	"scripts": {
		"docs:dev": "cross-env NODE_OPTIONS=--openssl-legacy-provider vuepress dev docs",
		"docs:build": "vuepress build docs",
		"vuepress:deploy": "./deploy.sh"
	},
	"dependencies": {
		"vuepress": "^1.9.9"
	}
}

设置之后,测试运行

$ pnpm run docs:dev
...
success [22:30:00] Build fa34ee finished in 153 ms! ( http://localhost:8080/ )

成功运行了。

package.json中设置变量NODE_OPTIONS=--openssl-legacy-provider,提交GitHub actions运行失败,应该是cross-env NODE_OPTIONS=--openssl-legacy-provider设置是不成功的,还是需要使用export NODE_OPTIONS=--openssl-legacy-provider来设置。更新.yml文件。

run: |
  yarn install
  node -v
  export NODE_OPTIONS=--openssl-legacy-provider
  yarn docs:build

提交GitHub actions运行成功了。

指定低版本的node

我们可以使用setup-nodeGitHub actions中指定低版本node

steps:
    - name: checkout
      uses: actions/checkout@master
    - name: setup-node
      uses: actions/setup-node@v3
      with:
        node-version: 16

参考

Github setup-node