できない.dev

Node.js で「error:0308010C:digital envelope routines::unsupported」が解決できない

Node.js 17 以降が OpenSSL 3 を採用し、webpack 4 系など古いツールが使う非推奨ハッシュが拒否されるためです。
ツールを更新するか、暫定的に --openssl-legacy-provider を付けて回避します。

#nodejs#openssl#webpack#build#err-ossl

要約

Error: error:0308010C:digital envelope routines::unsupported は、Node.js 17 以降が同梱する OpenSSL 3 が、webpack 4 系などの古いビルドツールが使う非推奨ハッシュアルゴリズムを拒否することで発生します。
恒久対策はツールチェーンの更新、即効性のある回避は --openssl-legacy-provider の付与です。

よくある原因

  1. OpenSSL 3 への移行: Node.js 17 で OpenSSL 3 が標準になり、MD4 など弱いアルゴリズムが既定で無効化された。
  2. webpack 4 の内部依存: webpack 4 はチャンクのハッシュ生成に旧アルゴリズムを使うため、新しい Node でそのまま落ちる。
  3. 古い CRA / scripts: react-scripts 4 系などが webpack 4 を内包しており、Node を上げた瞬間に再現する。

解決策

1. 環境変数で暫定回避する

すぐビルドを通したい場合は legacy provider を有効化します。

export NODE_OPTIONS=--openssl-legacy-provider
npm run build

このフラグは公式 CLI ドキュメントに記載された正式オプションですが、弱い暗号を許可する点に注意してください。

2. ツールチェーンを更新する(恒久対策)

webpack 5 系へ上げると根本解決します。

npm install webpack@latest webpack-cli@latest --save-dev
# CRA なら react-scripts を 5 以上へ
npm install react-scripts@latest

3. Node のバージョンを固定する

更新が難しい既存プロジェクトは、.nvmrc で Node 16 系に固定する暫定運用も可能です。
ただし Node 16 は EOL のため、あくまで移行までのつなぎとし、最終的には依存更新を行ってください。

この記事は役立ちましたか?