node.js >= v17のerror:0308010C:digital envelope routines問題をライブラリ更新で対処する
node.jsを現LTSのv18に上げるにあたり、v17で入ったOpenSSLによる変更で0308010C:digital envelope routines
エラーが出ることがあります。可能な限りライブラリのアップデートで対応できるようにする方法をまとめます。
背景
node.jsについて、直近LTSで2年近く使えるのはv18です。一方で、node.js >= v17において、各種ライブラリで使われるOpenSSLのバージョンが3系に更新されました。これにより、webpackなどのライブラリにおいてハッシュ関数を呼び出している場合に表題のエラーに遭遇することがあります。
エラー自体は--openssl-legacy-provider
オプションをつけてnode.jsを動かすか、v16系を使うworkaroundで解消されます。しかしながら、前者はセキュリティ上の懸念があり、後者は2023/9/11頃にサポート終了になります。そのため、これらworkaroundを使わずに問題を解消したいです。そこで、開発環境に応じてどのライブラリが問題になっているか調査・対処できるようにまとめました。
主な原因
Webpack-v4系を使っている場合に発生します。そのため、package-lock.jsonを見たときにpeerDependencyでwebpack < 5を指定しているライブラリを探してアップデートすると解消できます。後述のフレームワーク等を使っている場合、フレームワーク側の修正が利用できます。
Case.1: Next.jsプロジェクトの場合
Next.js v12.0.0でmd4の代わりにxxhash64を使うwebpackの設定に修正済みです。もしこれより古いバージョンであればアップデートしましょう。[1]
Case.2: Create-React-Appで作ったReactプロジェクト
react-scripts v5.0でWebpack 5系を使うようアップデートされました。もしこれより古いバージョンであればアップデートしましょう。[2]
Case.3: NuxtJSプロジェクト(v2系)の場合
v2.16.2でwebpack 5系を使うようアップデートされました。もしこれより古いバージョンであればアップデートしましょう。[3]
Case.4: storybookを使っている場合
webpackのv5系をbuilderとして初期化しておくと解消できます。[4]
$ npx sb init --builder webpack5
Discussion