エラーメッセージ
error:0308010C:digital envelope routines::unsupported
Node.js 17+ (OpenSSL 3) — code ERR_OSSL_EVP_UNSUPPORTED
このエラーの意味
あるコードが、OpenSSL 3 の既定のプロバイダーがもう提供していないアルゴリズムを要求しました。最もよく知られているのは MD4 で、古いバージョンの webpack がビルド時のハッシュ計算に使っています。Node 17 で OpenSSL 3 に切り替わり、レガシーなダイジェストや暗号は、デフォルトで無効になっている別の「legacy」プロバイダーに移されました。エラーが示すのは仕組み(デジタルエンベロープ層である EVP)であって、原因となったコードではありません。廃止されたアルゴリズムを OpenSSL 3 に要求すればどこでも同じコードが出ますが、発生例の圧倒的多数は webpack と Node 17 以降の組み合わせによるものです。
発生する理由
MD4 を要求する古いビルドツール
よくあるwebpack 4 の 4.46 まで(およびそれを固定して使うツール:react-scripts 4、vue-cli 4、古い Angular)は、デフォルトで MD4 を使ってモジュールのハッシュを計算します。Node 17 以降では、最初のビルドステップがこのエラーで停止します。スタックトレースには通常、webpack 内部の createHash が表示されます。webpack 4.47.0 には 5.61 と同じフォールバックが追加されたため、webpack 4 の最終リリースでは再びビルドできます。
レガシーなプリミティブを使うアプリケーションコード
ときどきcreateHash("md4") のような直接の呼び出し、RC4/DES/Blowfish を指定した createCipheriv、または同じことを行う依存関係が該当します。これらのアルゴリズムは暗号として破られており、意図的に既定のプロバイダーから外されました。
非常に古い PKCS#12 やキーストアのファイル
まれRC2/RC4 ベースの方式で暗号化された古い .p12/.pfx バンドルも、OpenSSL 3 の環境で読み込むと同じ壁に突き当たります。-legacy を付けずに openssl pkcs12 を実行するとこのコードが報告され、RC2-40-CBC が示されます。Node 自身の tls.createSecureContext() は、同じファイルを別のメッセージ「Unsupported PKCS12 PFX data」で拒否します。
修正方法
- 1.
ツールチェーンをアップグレードする(本当の解決策)
webpack 5.61 以降(4.x 系では 4.47)は、OpenSSL が MD4 を提供しなくなった場合、WASM による MD4 の実装にフォールバックします。react-scripts 5 にはこれが含まれています。問題を覆い隠すのではなく、取り除く方法です。
bash npm install --save-dev webpack@latest # CRA projects: npm install --save-dev react-scripts@5 - 2.
応急処置:legacy プロバイダーを有効にする
MD4 などのアルゴリズムをプロセス全体で再び有効にします。今日のビルドを通すためなら許容できますが、恒久的な設定にしてはいけません。プロセス内のすべてのコードが、破られたアルゴリズムを再び使える状態になるためです。
bash NODE_OPTIONS=--openssl-legacy-provider npm run build - 3.
自分のコードではアルゴリズムを置き換える
暗号用途ではないフィンガープリントの計算には、最新のダイジェストならどれでも使えます。署名を検証するコードは、そもそも MD4/MD5 を使うべきではありません。
js // before: createHash("md4") import { createHash } from "node:crypto"; const digest = createHash("sha256").update(data).digest("hex");