Node(v17+)报错Error:error:0308010C:digital envelope routines::unsupported
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
。如使用n
或nvm
来快速管理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-node
在GitHub actions
中指定低版本node
。
steps:
- name: checkout
uses: actions/checkout@master
- name: setup-node
uses: actions/setup-node@v3
with:
node-version: 16