如何解决error:0308010C:digital envelope routines::unsupported(ERR_OSSL_EVP_UNSUPPORTED)

现象:

部分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

【2】https://stackoverflow.com/questions/69692842/error-message-error0308010cdigital-envelope-routinesunsupported

【3】https://github.com/hzsrc/webpack-theme-color-replacer/commit/bec537031e27c8fde532ac42390a76cbffe7c26e

本页永久链接:https://www.orztip.com/?p=811&article_title=0308010c-err_ossl_evp_unsupported-in-node-v17