现象:
部分node js项目、或前端项目(比如基于vue 2的前端项目)使用node v17版本开始无法启动,会报:“Error: error:0308010C:digital envelope routines::unsupported”,有的时候stack也会报ERR_OSSL_EVP_UNSUPPORTED,例子:
Error: error:0308010C:digital envelope routines::unsupported
at new Hash (node:internal/crypto/hash:69:19)
at Object.createHash (node:crypto:138:10)
……
at FSReqCallback.readFileAfterClose as oncomplete {
opensslErrorStack: [ 'error:03000086:digital envelope routines::initialization error' ],
library: 'digital envelope routines',
reason: 'unsupported',
code: 'ERR_OSSL_EVP_UNSUPPORTED'
}
原因:
从node v17开始,node js默认不支持md4 hash等部分存在漏洞的SSL provider【2】,这导致早期项目不兼容。
解决方法:
方法一:使用环境变量,强制使用旧的SSL provider
Node js从v17开始,提供了一个可继续使用旧的SSL provider的设置。
全局环境变量使用如下:
Linux使用:
export NODE_OPTIONS=--openssl-legacy-provider
Windows cmd使用:
set NODE_OPTIONS=--openssl-legacy-provider
Powershell使用:
$env:NODE_OPTIONS = "--openssl-legacy-provider"
如果node项目不想定义全局环境变量,可在package.json里面引入cross-env【1】,然后在“scripts”内的每个命令定义局部环境变量,例子如下:
{
"name": "projecttest",
"version": "0.0.0",
//….
"scripts": {
"serve": "cross-env NODE_OPTIONS=--openssl-legacy-provider 命令A",
"build": "cross-env NODE_OPTIONS=--openssl-legacy-provider 命令B",
//….
}, "devDependencies": {
"cross-env": "^7.0.3",
//….
}
}
方法二:修改配置或源代码
部分vue 2项目可通过修改vue.config.js,指定configureWebpack.output.hashFunction来解决:
// vue.config.js
module.exports = {
//…..
configureWebpack: {
output: {
hashFunction: "sha256",
//…..
},
//…..
}
但部分则需要修改源代码,比如webpack-theme-color-replacer的commit bec537031e27c8fde532ac42390a76cbffe7c26e【3】。
如果无法修改源代码或配置,建议使用方法一。
参考:
【1】https://www.npmjs.com/package/cross-env
本页永久链接:https://www.orztip.com/?p=811&article_title=0308010c-err_ossl_evp_unsupported-in-node-v17