ERR_OSSL_EVP_UNSUPPORTEDエラーの解決方法【2025年最新版】Node.js・React・Vue開発者必見

スポンサーリンク

ERR_OSSL_EVP_UNSUPPORTEDエラーの解決方法【2025年最新版】Node.js・React・Vue開発者必見

Node.jsでReactやVueのプロジェクトを開発中に「ERR_OSSL_EVP_UNSUPPORTED」というエラーに遭遇して困っていませんか?この記事では、このエラーの原因と具体的な解決方法を、初心者にもわかりやすく解説します。


このエラーとは?発生する症状

ERR_OSSL_EVP_UNSUPPORTEDエラーの概要

ERR_OSSL_EVP_UNSUPPORTEDは、OpenSSL(暗号化ライブラリ)に関連するエラーコードです。正式なエラーメッセージは以下のように表示されることが多いです:

Error: error:0308010C:digital envelope routines::unsupported
    at Object.hash (node:internal/crypto/hash:...)
    ...
opensslErrorStack: [ 'error:03000086:digital envelope routines::initialization error' ],
library: 'digital envelope routines',
reason: 'unsupported',
code: 'ERR_OSSL_EVP_UNSUPPORTED'

このエラーは主に以下の状況で発生します:

  • npm startnpm run dev でReactアプリを起動しようとしたとき
  • vue-cli-service serve でVueアプリを起動しようとしたとき
  • webpack でビルドを実行しようとしたとき
  • create-react-app で作成したプロジェクトを動かそうとしたとき

ユーザーが経験する典型的な症状

開発者がこのエラーに遭遇すると、以下のような症状が見られます:

  1. 開発サーバーが起動しない: npm start を実行しても、エラーでプロセスが停止する
  2. ビルドが失敗する: 本番用のビルドコマンドがエラーで中断される
  3. 突然動かなくなる: 昨日まで動いていたプロジェクトが、Node.jsをアップデートした後に動かなくなる

影響範囲

このエラーはNode.js 17以降を使用するすべての開発環境に影響を与える可能性があります。特に以下のツールやフレームワークを使用しているプロジェクトで頻繁に発生します:

  • React(create-react-app)
  • Vue.js(vue-cli)
  • Angular
  • Next.js(古いバージョン)
  • Webpack 4以前を使用するプロジェクト
  • Nuxt.js

このエラーが発生する原因

原因1: Node.js 17以降でのOpenSSL 3.0へのアップグレード

最も根本的な原因は、Node.js 17がOpenSSL 3.0にアップグレードしたことです。

OpenSSL 3.0では、セキュリティ上の理由から、古い暗号化アルゴリズム(MD4、MD5など)や弱い暗号スイートがデフォルトで無効化されました。これらのアルゴリズムは完全に削除されたわけではなく、「レガシープロバイダー」に移動されました。

つまり、あなたのアプリケーションや依存関係にあるモジュールが、これらの非推奨アルゴリズムを使用しようとすると、Node.jsがエラーを投げるようになったのです。

原因2: 古いバージョンのWebpackやビルドツール

Webpack 4以前のバージョンは、内部でMD4ハッシュアルゴリズムを使用しています。Node.js 17以降ではMD4がデフォルトで無効化されているため、Webpack 4を使っているプロジェクトでこのエラーが発生します。

create-react-appの古いバージョン(react-scripts 4.x以前)も、内部でWebpack 4を使用しているため、同様の問題が発生します。

原因3: 古い依存関係やパッケージ

プロジェクトの node_modules 内にある古いパッケージが、非推奨の暗号化アルゴリズムに依存している場合もエラーの原因となります。特に以下のようなパッケージで問題が起きやすいです:

  • 古いバージョンの node-sass
  • 古いバージョンの crypto 関連パッケージ
  • メンテナンスされていないビルドツール

原因4: Node.jsのバージョンアップ後の環境変化

多くの開発者が経験するシナリオは、「何も変更していないのに突然動かなくなった」というものです。これは主に以下の理由で発生します:

  • OSのアップデートでNode.jsが自動的に更新された
  • nvmなどでNode.jsのバージョンを切り替えた
  • CI/CD環境でNode.jsのバージョンが変更された

解決方法1: Node.jsのバージョンを適切に管理する(推奨)

最も推奨される解決方法は、Node.jsのLTS(長期サポート)バージョンの最新版を使用することです。

手順1: 現在のNode.jsバージョンを確認する

まず、現在使用しているNode.jsのバージョンを確認します。

node -v

出力例:

v17.9.0

手順2: Node.jsをLTSバージョンにアップグレードする

Node.jsの公式サイト(https://nodejs.org/)から最新のLTS版をダウンロードしてインストールします。2025年現在、推奨されるLTSバージョンはNode.js 20.x または 22.x(LTS)です。

Windowsの場合:
1. Node.js公式サイトからLTSインストーラーをダウンロード
2. インストーラーを実行してインストール

macOS/Linuxの場合(nvm使用を推奨):

# nvmがインストールされていない場合、先にインストール
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash

# 最新のLTSバージョンをインストール
nvm install --lts

# インストールしたLTSバージョンを使用
nvm use --lts

手順3: プロジェクトの依存関係を再インストールする

Node.jsをアップグレードした後は、node_modulesを削除して依存関係を再インストールします。

# node_modulesとpackage-lock.jsonを削除
rm -rf node_modules package-lock.json

# 依存関係を再インストール
npm install

手順4: react-scriptsをバージョン5以上にアップグレード(Reactプロジェクトの場合)

create-react-appを使用している場合、react-scriptsをバージョン5以上にアップグレードすることで問題が解決することがあります。

npm install react-scripts@latest

注意点

  • プロジェクトの依存関係によっては、最新のNode.jsと互換性がない場合があります
  • アップグレード前に必ずバックアップを取ってください
  • チーム開発の場合は、全員が同じNode.jsバージョンを使用するよう .nvmrc ファイルを設定することを推奨します

解決方法2: –openssl-legacy-providerフラグを使用する

Node.jsのアップグレードができない場合や、一時的な回避策が必要な場合は、--openssl-legacy-providerフラグを使用します。

package.jsonのscriptsを修正する方法

Reactプロジェクトの場合:

package.jsonscriptsセクションを以下のように修正します。

修正前:

{
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build"
  }
}

修正後:

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

Vueプロジェクトの場合:

{
  "scripts": {
    "serve": "vue-cli-service serve --openssl-legacy-provider",
    "build": "vue-cli-service build --openssl-legacy-provider"
  }
}

環境変数を設定する方法

NODE_OPTIONS環境変数を使用して、システム全体でレガシープロバイダーを有効にする方法もあります。

Linux/macOSの場合:

export NODE_OPTIONS=--openssl-legacy-provider
npm start

Windowsの場合(コマンドプロンプト):

set NODE_OPTIONS=--openssl-legacy-provider
npm start

Windowsの場合(PowerShell):

$env:NODE_OPTIONS="--openssl-legacy-provider"
npm start

cross-envを使用する方法(クロスプラットフォーム対応)

異なるOS間で同じコマンドを使用したい場合は、cross-envパッケージを使用します。

npm install --save-dev cross-env

package.jsonを以下のように修正:

{
  "scripts": {
    "start": "cross-env NODE_OPTIONS=--openssl-legacy-provider react-scripts start",
    "build": "cross-env NODE_OPTIONS=--openssl-legacy-provider react-scripts build"
  }
}

注意点

この方法は一時的な回避策です。レガシープロバイダーを有効にすることで、セキュリティ的に脆弱なアルゴリズムを使用することになるため、長期的にはNode.jsや依存関係のアップグレードを検討してください。


解決方法3: Webpackや依存関係をアップグレードする(上級者向け)

根本的な解決策として、問題の原因となっている依存関係自体をアップグレードする方法があります。

Webpack 5へのアップグレード

Webpack 4以前を使用している場合、Webpack 5にアップグレードすることでエラーが解消されます。

npm install webpack@latest webpack-cli@latest --save-dev

ただし、Webpack 5はWebpack 4と完全な後方互換性がないため、設定ファイル(webpack.config.js)の修正が必要になる場合があります。

create-react-appからのイジェクト(最終手段)

create-react-appでWebpackの設定を直接変更する必要がある場合は、イジェクト(eject)を実行します。

npm run eject

警告: イジェクトは不可逆的な操作です。実行すると、create-react-appが管理していたすべての設定ファイルがプロジェクトに展開され、以降は自分で管理する必要があります。

イジェクト後、webpack.config.js内のハッシュアルゴリズムを変更できます:

// webpack.config.js
module.exports = {
  // ...
  output: {
    // MD4の代わりにSHA-256を使用
    hashFunction: 'sha256',
  },
};

特定のパッケージをアップグレードする

問題の原因となっているパッケージを特定し、アップグレードします。

# どのパッケージが古いかを確認
npm outdated

# 特定のパッケージをアップグレード
npm update パッケージ名

エラーを予防するには

事前対策

  1. Node.jsのバージョンを固定する
    • プロジェクトのルートに.nvmrcファイルを作成し、使用するNode.jsのバージョンを明記する
    • 例:.nvmrcの内容を20.10.0などとする
  2. package-lock.jsonをバージョン管理に含める
    • package-lock.jsonをGitリポジトリにコミットし、チーム全員が同じ依存関係を使用できるようにする
  3. 依存関係を定期的にアップデートする
    • npm auditコマンドで脆弱性をチェックする
    • npm updateで依存関係を最新に保つ

定期メンテナンス方法

# 脆弱性のチェック
npm audit

# 脆弱性の自動修正(可能な場合)
npm audit fix

# 古いパッケージの確認
npm outdated

# すべてのパッケージをアップデート
npm update

CI/CD環境での対策

  • CI/CDパイプラインでNode.jsのバージョンを明示的に指定する
  • GitHub Actionsの例:
    “`yaml

    <ul>
    <li>uses: actions/setup-node@v4
    with:
    node-version: '20.x'
    “`


まとめ

ERR_OSSL_EVP_UNSUPPORTEDエラーは、Node.js 17以降でOpenSSL 3.0が導入されたことによる互換性の問題が原因です。以下の方法で解決できます:

重要ポイントの振り返り

  1. 推奨: Node.jsのLTS版(20.x以降)を使用し、react-scriptsやWebpackを最新版にアップグレードする
  2. 一時的な回避策: --openssl-legacy-providerフラグを使用する
  3. 上級者向け: Webpackの設定を直接変更してハッシュアルゴリズムを変更する

解決できない場合の次のステップ

上記の方法を試しても解決しない場合は、以下を検討してください:

  • プロジェクトの依存関係を詳細に分析し、問題の原因となっているパッケージを特定する
  • GitHubのIssueやStack Overflowで同様の問題を検索する
  • 最終手段として、プロジェクトを最新のフレームワークバージョンで再構築することを検討する

このエラーは多くの開発者が遭遇する一般的な問題であり、適切な対処法を知っていれば必ず解決できます。困ったときはこの記事を参考にしてみてください。


参考資料

コメント

タイトルとURLをコピーしました