Skip to content

Node.js v18でのopensslErrorStackエラー解決法

問題概要

Node.jsをバージョン18にアップグレード後に、次のエラーが発生する場合があります:

text
opensslErrorStack: [ 'error:03000086:digital envelope routines::initialization error' ],
library: 'digital envelope routines',
reason: 'unsupported',
code: 'ERR_OSSL_EVP_UNSUPPORTED'

このエラーは、Node.js v17以降でOpenSSL 3.0が採用され、レガシーな暗号化プロバイダーがデフォルトで無効化されたことに起因します。特にReactプロジェクト(create-react-app)で頻繁に発生します。

根本原因

Node.jsがアップデートされてもプロジェクトの依存パッケージ(react-scriptsなど)が古いままの場合、新しい暗号化方式との互換性が失われます。

解決方法ランキング(優先度順)

1. パッケージの最新バージョンに更新(最推奨)

依存パッケージを最新版に更新することで根本解決が可能です:

bash
# react-scripts を最新版に更新
npm install react-scripts@latest

# 全パッケージを相互依存関係を考慮して更新
npm install

特徴

  • 永続的解決: 根本的な問題を解消
  • セキュリティ向上: 最新のセキュリティパッチを適用
  • 互換性確保: Node.js v18+と完全対応

2. --openssl-legacy-provider フラグで一時対応

パッケージ更新が直ちに難しい場合の一時的対応策

json
{
  "scripts": {
    "start": "react-scripts --openssl-legacy-provider start",
    "build": "react-scripts --openssl-legacy-provider build"
  }
}

注意点

  • 非推奨設定: レガシーな暗号化方式を強制的に有効化
  • 一時利用厳守: バージョン更新までの暫定措置
  • セキュリティリスク: 脆弱性が存在する可能性あり

3. 環境変数による暫定対応(OS共通)

OSやシェルに応じた環境変数設定方法:

bash
export NODE_OPTIONS=--openssl-legacy-provider
ps1
$env:NODE_OPTIONS = "--openssl-legacy-provider"
bat
set NODE_OPTIONS=--openssl-legacy-provider

適用範囲

  • プロジェクト単位: 特定プロジェクトのみに適用可
  • セッション限り: 再起動でリセットされる(永続化するには.envファイル推奨)

4. Node.jsバージョン管理ツールによる切り替え(最終手段)

Node Version Manager (nvm)を使ったバージョン切り替え:

bash
# Windowsの場合: https://github.com/coreybutler/nvm-windowsをインストール

# Node.js v16インストール
nvm install 16.20.2

# v16を有効化
nvm use 16

注意事項

  • 非推奨: v16は2023-09-11にEOL(寿命終了)到達
  • セキュリティ懸念: 未修正脆弱性のリスク増大
  • 限定利用: 移行中の短期的な利用に限定

ベストプラクティスの実装方法

依存パッケージ全面更新(推奨手順)

  1. 更新可能なパッケージを確認:
bash
npx npm-check-updates
  1. package.jsonを自動更新:
bash
npx npm-check-updates -u
  1. 依存関係を再インストール:
bash
npm install

恒久的な回避策が必要な場合

.envファイルを作成し、環境変数を永続化:

env
# .envファイルに記載(全環境で有効)
NODE_OPTIONS=--openssl-legacy-provider

エラー再発予防策

  1. 定期的な依存関係更新:

    bash
    npm outdated # 古いパッケージ確認
    npm update   # 安全な範囲で自動更新
  2. バージョニングシステム採用:

    bash
    # .nvmrcファイルを作成(プロジェクトごとにNodeバージョン固定)
    echo "18" > .nvmrc && nvm use
  3. CI/CDパイプラインでのチェック:

    yml
    jobs:
      build:
        runs-on: ubuntu-latest
        steps:
          - uses: actions/setup-node@v3
            with:
              node-version: '18'

まとめ

方法推奨度適切なケース
パッケージ更新★★★★★長期運用・本番環境
--openssl-legacy-provider(package.json)★★☆☆☆緊急時一時対応
環境変数設定★★★☆☆開発環境・テスト環境
Node.jsバージョン降格★☆☆☆☆移行期間限定

根本解決を最優先し、--openssl-legacy-providerはあくまで暫定措置として使用してください。Reactプロジェクトは2023年以降のreact-scripts v5+で新OpenSSLに対応済みなので、まずはパッケージ更新を実行しましょう。