なんかいろいろと書いてくブログ

関東のどこかで働く、一般人

Node 18, ERR_OSSL_EVP_UNSUPPORTED対応

CI/CDの一部として使用しているAzure piplines のビルドエージェントで使用しているnodeのバージョンが知らないうちにv16からv18になっており

下記のエラーによりNuxtプロジェクトのbuidに失敗していた

node:internal/crypto/hash:71
this[kHandle] = new _Hash(algorithm, xofLen);

Error : error : 0308010C:digital envelope routines::unsupported...
.
.
.
at FSReqCallback.readFileAfterClose [as oncomplete] (node:internal/fs/read_file_context:68:3) {
    opensslErrorStack: [ 'error:03000086:digital envelope routines::initialization error' ],
    library: 'digital envelope routines',
    reason: 'unsupported',
    code: 'ERR_OSSL_EVP_UNSUPPORTED'
}

Node.js v18.14.0

Node v17からOpenSSL3に対応した過程で、一部の推奨されないアルゴリズムに対して制約がかけられたのが原因とのこと
node/CHANGELOG_V17.md at main · nodejs/node · GitHub

対応としては

  • 使用するnodeをv16にダウングレード
  • --openssl-legacy-providerを使用して古いプロバイダーを使用する

のどちらかが必要

今回は緊急回避的に、後者で対応
build時のオプションにNODE_OPTIONS=--openssl-legacy-providerを追加する

package.json

{
  "scripts": {
    "build": "NODE_OPTIONS=--openssl-legacy-provider nuxt build"
    }
}

また、Windows環境を考慮するのであれば
コマンドがSET NODE_OPTIONS=--openssl-legacy-providerと異なるので
その差分を吸収するためにcross-envを使用
cross-env - npm (npmjs.com)

npm install --save-dev cross-env

cross-envを使用してNODE_OPTIONSを設定する

package.json

{
  "scripts": {
    "build": "cross-env NODE_OPTIONS=--openssl-legacy-provider nuxt build"
    }
}

でBuildが通るはず