Skip to content

Node.js ERR_OSSL_EVP_UNSUPPORTEDエラーの解決

問題の説明

Node.jsプロジェクトでnpm run startを実行する際、以下のエラーが発生することがあります:

text
ex.js:59:103 {
  opensslErrorStack: ['error:03000086:digital envelope routines::initialization error'],
  library: 'digital envelope routines',
  reason: 'unsupported',
  code: 'ERR_OSSL_EVP_UNSUPPORTED'
}
Node.js v19.8.1 ERROR: "front" exited with 1.

このエラーの主な原因は:

  • Node.js v17以降でOpenSSL 3.0が採用され、古い暗号化アルゴリズムがデフォルトで無効化された
  • プロジェクトの依存関係(特にwebpackreact-scripts)が非推奨となった暗号方式を使用している
  • OpenSSLのレガシー機能を明示的に有効化する設定が必要

注意

ポートの空き状況はこのエラーとは無関係です。ポート解放を試みても解決しません。

根本的な解決策(推奨)

1. 依存関係の更新(最適解)

プロジェクトの依存関係に問題がある可能性が高いです。以下の手順で更新します:

bash
# 開発依存関係の監査と自動修正
npm audit fix --force

# react-scriptsを使用している場合の明示的更新
npm install react-scripts@latest

なぜこれが効果的なのか?

Node.js v17以降でのOpenSSL 3.0対応として、多くのライブラリは既に更新されています。古いpackage-lock.jsonが原因で互換性のないバージョンが固定されている可能性があります。

2. Node.jsのLTSバージョンへのアップグレード

実行しているNode.jsバージョンが古い場合:

bash
nvm install --lts
nvm use --lts

推奨バージョン

現在のNode.js LTSバージョン(記事執筆時点ではv20.x)を使用すると、OpenSSL 3.0に完全対応しています。

一時的な回避策(開発環境用)

OS別の環境変数設定

コードグループでOSを選択してコマンドを表示:

bash
export NODE_OPTIONS=--openssl-legacy-provider
npm run start
powershell
$env:NODE_OPTIONS="--openssl-legacy-provider"
npm run start
cmd
set NODE_OPTIONS=--openssl-legacy-provider
npm run start

注意点

この方法は次の制限があります:

  • 本番環境では非推奨(セキュリティリスクあり)
  • Node.js v18以降で非推奨機能が完全削除される可能性
  • 根本解決ではないため、依存関係の更新を推奨

補足:トラブルシューティング

npm audit fixで解決しない場合

より詳細な監査と手動修正を試みます:

bash
# 監査レポートの表示
npm audit --json

# 開発依存関係を含めた修正
npm audit fix --include=dev

react-scriptsのバージョン固定

特定バージョンでのみ動作する場合は明示的インストール:

bash
npm install react-scripts@5.0.1

回避策を選ぶ際の判断基準

解決策推奨度適用場面
依存関係の更新★★★全ての環境、長期運用向け
Node.js LTSアップグレード★★★プロジェクト全体のメンテナンス時
環境変数での回避★☆☆緊急対応・ローカル開発のみ
Node.jsダウングレード非推奨(セキュリティ問題のリスク)

まとめ

ERR_OSSL_EVP_UNSUPPORTEDエラーはOpenSSL 3.0のセキュリティ強化に起因します。以下の手順で解決できます:

  1. npm audit fix --forceで依存関係を最新化
  2. Node.jsを最新LTSバージョンにアップデート
  3. 緊急時のみ--openssl-legacy-providerオプションを一時使用

ベストプラクティス

環境変数での回避は本番環境では絶対に使用しないでください。依存関係更新がセキュリティ面でも技術的負債削減面でも最適解です。