Skip to content

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)を使用することです。

bash
# Node.js v16のインストール
nvm install 16

# デフォルトバージョンを16に設定
nvm alias default v16.13.0

# Node.js v17がインストールされている場合は削除
nvm uninstall v17
bash
# 現在のNode.jsをアンインストール後、公式サイトからv16.x LTSをインストール
docker
# Dockerfileでベースイメージを指定
FROM node:16-alpine

Node.js v16.xは2023年9月までLTSサポートが継続されるため、プロダクション環境ではこのバージョンの使用が推奨されます。

方法2: 環境変数で互換性モードを有効にする

一時的な解決策として、OpenSSLのレガシープロバイダーを使用する方法があります。

bash
export NODE_OPTIONS=--openssl-legacy-provider
npm run dev
bash
$env:NODE_OPTIONS="--openssl-legacy-provider"
npm run dev
bash
set NODE_OPTIONS=--openssl-legacy-provider
npm run dev

package.jsonのscriptsセクションに直接設定することも可能です:

json
{
  "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"
  }
}
json
{
  "scripts": {
    "start": "NODE_OPTIONS=--openssl-legacy-provider react-native start"
  }
}
json
{
  "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の一部のバージョンは、これらの非推奨アルゴリズムに依存しているため、互換性の問題が発生します。

予防策とベストプラクティス

  1. Node.jsのバージョン管理: nvmやVoltaなどのバージョン管理ツールを使用し、プロジェクトごとに適切なNode.jsバージョンを指定する
  2. .nvmrcファイルの活用: プロジェクトルートに.nvmrcファイルを作成し、使用するNode.jsバージョンを明示する
bash
16.13.0
  1. ドッカー環境の設定: コンテナ環境でも明確なNode.jsバージョンを指定する
dockerfile
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へのダウングレードが最も安全で推奨される解決方法です。