ERR_OSSL_EVP_UNSUPPORTED エラーの解決方法
問題の概要
Node.js v17以降でNext.jsやReact、React Nativeなどのプロジェクトを実行すると、次のようなエラーが発生することがあります:
Error: error:0308010C:digital envelope routines::unsupported
at new Hash (node:internal/crypto/hash:67:19)
at Object.createHash (node:crypto:130:10)
このエラーは、Node.js v17でOpenSSL 3.0が導入され、一部の暗号化アルゴリズムのサポートが変更されたことに起因しています。Webpackなどのビルドツールが使用していた一部のハッシュ関数が非推奨となり、互換性の問題が発生しています。
解決方法
方法1: Node.jsのバージョンをダウングレードする(推奨)
最も安定した解決策は、Node.jsのLTSバージョン(現在は16.x)を使用することです。
# Node.js v16のインストール
nvm install 16
# デフォルトバージョンを16に設定
nvm alias default v16.13.0
# Node.js v17がインストールされている場合は削除
nvm uninstall v17
# 現在のNode.jsをアンインストール後、公式サイトからv16.x LTSをインストール
# Dockerfileでベースイメージを指定
FROM node:16-alpine
Node.js v16.xは2023年9月までLTSサポートが継続されるため、プロダクション環境ではこのバージョンの使用が推奨されます。
方法2: 環境変数で互換性モードを有効にする
一時的な解決策として、OpenSSLのレガシープロバイダーを使用する方法があります。
export NODE_OPTIONS=--openssl-legacy-provider
npm run dev
$env:NODE_OPTIONS="--openssl-legacy-provider"
npm run dev
set NODE_OPTIONS=--openssl-legacy-provider
npm run dev
package.jsonのscriptsセクションに直接設定することも可能です:
{
"scripts": {
"dev": "NODE_OPTIONS=--openssl-legacy-provider next dev",
"build": "NODE_OPTIONS=--openssl-legacy-provider next build",
"start": "NODE_OPTIONS=--openssl-legacy-provider next start"
}
}
{
"scripts": {
"start": "NODE_OPTIONS=--openssl-legacy-provider react-native start"
}
}
{
"scripts": {
"start": "SET NODE_OPTIONS=--openssl-legacy-provider && react-scripts start",
"build": "SET NODE_OPTIONS=--openssl-legacy-provider && react-scripts build"
}
}
WARNING
この方法は一時的な対策であり、セキュリティ上のリスクがある可能性があります。本番環境ではNode.js v16.xへのダウングレードを推奨します。
根本原因と技術的背景
このエラーは、Node.js v17でOpenSSL 3.0が採用されたことにより発生します。OpenSSL 3.0では、MD4や一部の古い暗号化アルゴリズムがレガシー扱いとなり、デフォルトでは無効化されています。
Webpack 4および5の一部のバージョンは、これらの非推奨アルゴリズムに依存しているため、互換性の問題が発生します。
予防策とベストプラクティス
- Node.jsのバージョン管理: nvmやVoltaなどのバージョン管理ツールを使用し、プロジェクトごとに適切なNode.jsバージョンを指定する
- .nvmrcファイルの活用: プロジェクトルートに
.nvmrc
ファイルを作成し、使用するNode.jsバージョンを明示する
16.13.0
- ドッカー環境の設定: コンテナ環境でも明確なNode.jsバージョンを指定する
FROM node:16.13.0-alpine
まとめ
ERR_OSSL_EVP_UNSUPPORTED
エラーは、Node.js v17以上の環境で発生するOpenSSL互換性問題です。以下の解決策から適切な方法を選択してください:
- 🔄 長期的解決策: Node.js v16.x LTSへのダウングレード
- ⚡ 一時的対策:
NODE_OPTIONS=--openssl-legacy-provider
の設定 - 🛡️ プロダクション: 必ずLTSバージョンを使用し、セキュリティアップデートを適用する
プロジェクトの安定性とセキュリティを考慮すると、Node.js v16.xへのダウングレードが最も安全で推奨される解決方法です。