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 の付与です。
よくある原因
- OpenSSL 3 への移行: Node.js 17 で OpenSSL 3 が標準になり、MD4 など弱いアルゴリズムが既定で無効化された。
- webpack 4 の内部依存: webpack 4 はチャンクのハッシュ生成に旧アルゴリズムを使うため、新しい Node でそのまま落ちる。
- 古い CRA / scripts:
react-scripts4 系などが 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@latest3. Node のバージョンを固定する
更新が難しい既存プロジェクトは、.nvmrc で Node 16 系に固定する暫定運用も可能です。
ただし Node 16 は EOL のため、あくまで移行までのつなぎとし、最終的には依存更新を行ってください。