何が起きたのか?パフォーマンス向上を期待して、ローカル環境をNode.js v18やv20にアップグレードしたばかりかもしれません。しかし、npm startを実行した瞬間に、レガシーなReactプロジェクトがクラッシュしてしまったのではないでしょうか。この特定のエラーは通常、古いビルドツールがモダンなNode.jsバージョンのより厳格なセキュリティ基準に直面したときに発生します。
Error: error:0308010C:digital envelope routines::unsupported
at new Hash (node:internal/crypto/hash:71:19)
at Object.createHash (node:crypto:133:10)
at /node_modules/webpack/lib/util/createHash.js:135:53
なぜビルドが失敗したのか問題はNode.js v17から始まりました。このバージョンで、OpenSSL 1.1.1がOpenSSL 3.0に置き換えられました。この新しいセキュリティレイヤーは、より厳格なポリシーを持っています。MD4のような古くて安全でないアルゴリズムを、デフォルトで無効化されている「レガシー(legacy)」プロバイダーへと移動させたのです。
Webpack 4やCreate React Appの古いバージョン(v4以下)は、ファイルハッシュの生成にMD4を使用しています。これらのツールがハッシュ関数を呼び出そうとすると、OpenSSL 3.0はそのルーチンを「安全」とは認めないため、リクエストをブロックします。その結果、ビルドプロセスが即座に停止してしまうのです。
クイック解決策:環境変数の設定納期が迫っている場合は、Node.jsにレガシープロバイダーの使用を強制することができます。これにより、コードを変更することなく厳格なセキュリティチェックを回避できます。ローカル開発における信頼できる応急処置です。
LinuxまたはmacOSの場合プロジェクトを開始する前に、ターミナルで次のコマンドを実行します:
export NODE_OPTIONS=--openssl-legacy-provider
npm start
Windows(コマンドプロンプト)の場合```
set NODE_OPTIONS=--openssl-legacy-provider npm start
### Windows(PowerShell)の場合```
$env:NODE_OPTIONS = "--openssl-legacy-provider"
npm start
より良い方法:package.jsonの更新手動でexportコマンドを入力するのは面倒です。チームメイトが同じ壁にぶつからないよう、package.jsonで自動化するのが得策です。ただし、OSによって環境変数の扱いが異なるため、cross-envパッケージを使用するのが最も安全な方法です。
まず、ヘルパーをインストールします:
npm install cross-env --save-dev
次に、scriptsセクションを更新します。これにより、Windows、Mac、Linuxでシームレスに修正が適用されます:
{
"scripts": {
"start": "cross-env NODE_OPTIONS=--openssl-legacy-provider react-scripts start",
"build": "cross-env NODE_OPTIONS=--openssl-legacy-provider react-scripts build"
}
}
長期的な解決策:スタックのアップグレード環境変数の修正は、技術的には回避策(ワークアラウンド)に過ぎません。依然として非推奨のアルゴリズムを使用している状態です。時間に余裕があるなら、OpenSSL 3.0をネイティブにサポートするツールに移行するのが「正しい」解決策です。
- Webpackのアップグレード: Webpack 5.20.0以降に移行してください。このバージョンでは、ハッシュアルゴリズムを高速で互換性のある
xxhash64に変更できます。 - CRAのアップグレード: Create React Appを使用している場合は、
react-scriptsv5.0.0以降に移行してください。 - NVMの使用: プロジェクトをアップグレードできない場合は、Node Version Managerを使用してNode.js v16.14.0 (LTS)に戻してください。このバージョンは古いOpenSSL 1.1.1を使用しているため、このエラーは発生しません。
nvm install 16
nvm use 16
DockerおよびCI/CDでの修正JenkinsやGitHub Actionsのパイプラインが失敗している場合は、Dockerfileにフラグを追加してください。これにより、コンテナ環境でのビルドクラッシュを防ぐことができます:
# ビルドプロセス中にフラグを使用する
ENV NODE_OPTIONS=--openssl-legacy-provider
RUN npm run build
修正を確認する方法修正できたと思い込まず、以下の手順で確認してください:
- 古いビルド成果物を削除するため、
node_modules/.cacheフォルダを削除します。 npm run buildを実行します。/buildまたは/distフォルダを確認します。ファイルが生成され、ターミナルに「Compiled successfully(コンパイル成功)」と表示されれば完了です。node --help | grep openssl-legacy-providerを実行します。結果が返ってくれば、現在のNodeバージョンはそのフラグを認識しています。

