Node.js 17 ERR_OSSL_EVP_UNSUPPORTED エラーの解決方法
問題
Node.js 17.0.1 にアップグレード後、Gatsby プロジェクトのビルド時に以下のエラーが発生します:
Error: digital envelope routines::unsupported
opensslErrorStack: [ 'error:03000086:digital envelope routines::initialization error' ],
library: 'digital envelope routines',
reason: 'unsupported',
code: 'ERR_OSSL_EVP_UNSUPPORTED'
Node.js 16 にダウングレードすると正常に動作します。この問題は、React、Vue.js、Angular などの他のフレームワークでも同様に発生する可能性があります。
原因
このエラーは、Node.js 17 で OpenSSL 3.0 が導入されたことに関連しています。OpenSSL 3.0 では、セキュリティ上の理由から特定の暗号化アルゴリズムや鍵サイズがデフォルトで無効化されました。
主な原因は、webpack が md4
ハッシュアルゴリズムを使用していることです。Node.js の組み込み OpenSSL はこのアルゴリズムをサポートしなくなり、エラーが発生します。
技術的詳細
- Webpack 4: バージョン 4.47.0 以前で問題が発生
- Webpack 5: バージョン 5.61.0 以前で問題が発生
- Node.js 17+ では OpenSSL 3.0 がデフォルトで使用される
解決策
方法1: Webpack のアップグレード(推奨)
根本的な解決策は、使用している webpack を最新バージョンにアップグレードすることです。
# Webpack 4 を使用している場合
npm install webpack@^4.47.0
# Webpack 5 を使用している場合
npm install webpack@^5.61.0
# Webpack 4 を使用している場合
yarn add webpack@^4.47.0
# Webpack 5 を使用している場合
yarn add webpack@^5.61.0
最新の webpack バージョンでは、Node.js の組み込み OpenSSL に依存しない WASM ベースの md4
実装が採用されています。
方法2: OpenSSL レガシープロバイダの使用
一時的な対策として、OpenSSL のレガシープロバイダを有効にすることができます。
環境変数での設定
export NODE_OPTIONS=--openssl-legacy-provider
package.json での設定
{
"scripts": {
"start": "NODE_OPTIONS=--openssl-legacy-provider react-scripts start",
"build": "NODE_OPTIONS=--openssl-legacy-provider react-scripts build",
"test": "NODE_OPTIONS=--openssl-legacy-provider react-scripts test",
"eject": "NODE_OPTIONS=--openssl-legacy-provider react-scripts eject"
}
}
{
"scripts": {
"serve": "NODE_OPTIONS=--openssl-legacy-provider vue-cli-service serve",
"build": "NODE_OPTIONS=--openssl-legacy-provider vue-cli-service build",
"lint": "NODE_OPTIONS=--openssl-legacy-provider vue-cli-service lint"
}
}
{
"scripts": {
"start": "set NODE_OPTIONS=--openssl-legacy-provider && react-scripts start",
"build": "set NODE_OPTIONS=--openssl-legacy-provider && react-scripts build"
}
}
cross-env を使用したクロスプラットフォーム対応
npm install --save-dev cross-env
{
"scripts": {
"build": "cross-env NODE_OPTIONS='--openssl-legacy-provider' vue-cli-service build"
}
}
方法3: Node.js のバージョンダウン(一時的対策)
注意
これは一時的な解決策であり、長期的には推奨されません。セキュリティアップデートや新機能の恩恵を受けられなくなります。
Node.js 16 などの LTS バージョンにダウングレードする方法:
# nvm (Node Version Manager) を使用
nvm install 16
nvm use 16
# または直接インストール
# Node.js 16 LTS を公式サイトからダウンロードしてインストール
推奨アプローチ
- まず webpack を最新バージョンにアップグレードしてください - これが最も適切な解決策です
- やむを得ない場合のみ
--openssl-legacy-provider
オプションを使用する - Node.js のダウングレードは最終手段としてのみ検討する
ベストプラクティス
- 定期的に依存関係を更新して、セキュリティパッチと互換性修正を適用する
- 本番環境では常に LTS バージョンの Node.js を使用する
- クロスプラットフォーム対応が必要な場合は cross-env のようなツールを使用する
関連情報
この問題は webpack の更新によって解決されているため、可能な限り最新バージョンへのアップグレードを推奨します。