Skip to content

ERR_OSSL_EVP_UNSUPPORTED エラーの解決方法

問題の概要

Node.js 17以降の環境でWebpackビルドを実行すると、以下のエラーが発生することがあります:

none
Error: error:0308010C:digital envelope routines::unsupported
    at new Hash (node:internal/crypto/hash:67:19)
    at Object.createHash (node:crypto:130:10)

このエラーは、OpenSSL 3.0で非推奨となったMD4ハッシュアルゴリズムがWebpackのデフォルトで使用されていることが原因で発生します。

根本原因

Node.js 17ではOpenSSL 3.0が採用され、セキュリティ上の理由からMD4アルゴリズムのサポートがデフォルトで無効化されました。しかし、WebpackはデフォルトでMD4をハッシュ生成に使用しているため、この互換性問題が発生します。

解決方法

方法1: Node.jsのバージョンダウングレード(一時的な解決策)

最も簡単な解決方法は、Node.jsをLTSバージョン(16.x)にダウングレードすることです:

bash
# nvmを使用している場合
nvm install 16.13.0
nvm use 16.13.0

# またはDockerを使用している場合
FROM node:16-alpine

WARNING

この方法は一時的な解決策です。長期的には以下の永続的な解決策を実装することを推奨します。

方法2: 環境変数でレガシープロバイダーを有効化

ビルド時にOpenSSLのレガシープロバイダーを有効にします:

bash
# macOS/Linux
export NODE_OPTIONS=--openssl-legacy-provider

# Windows (コマンドプロンプト)
set NODE_OPTIONS=--openssl-legacy-provider

# Windows (PowerShell)
$env:NODE_OPTIONS="--openssl-legacy-provider"

package.jsonのスクリプトで設定する場合:

json
{
  "scripts": {
    "build": "NODE_OPTIONS=--openssl-legacy-provider webpack",
    "dev": "NODE_OPTIONS=--openssl-legacy-provider webpack serve"
  }
}

方法3: Webpackのハッシュアルゴリズムを変更

Webpack 5.54.0以上を使用している場合、より現代的なハッシュアルゴリズムに切り替えることができます:

javascript
// webpack.config.js
module.exports = {
  output: {
    hashFunction: "sha256", // または "xxhash64"
  },
};

TIP

xxhash64はWebpackに同梱されているアルゴリズムで、OpenSSLに依存しないためおすすめです。

方法4: パッチ適用(緊急時の回避策)

どうしても他の方法が使えない場合、直接cryptoモジュールをモンキーパッチする方法もあります:

javascript
// プロジェクトのエントリーポイントファイルに追加
const crypto = require("crypto");
const originalCreateHash = crypto.createHash;
crypto.createHash = (algorithm) => 
  originalCreateHash(algorithm === "md4" ? "sha256" : algorithm);

TypeScriptの場合:

typescript
import crypto from "crypto";

const crypto_orig_createHash = crypto.createHash;
Object.assign(crypto, {
  createHash: (algorithm: string): crypto.Hash => 
    crypto_orig_createHash(algorithm === "md4" ? "sha256" : algorithm),
});

DANGER

この方法は最終手段としてのみ使用してください。他のライブラリの動作に影響を与える可能性があります。

フレームワーク別の対応

Next.jsの場合

json
{
  "scripts": {
    "dev": "cross-env NODE_OPTIONS='--openssl-legacy-provider' next dev"
  }
}

Laravel Mixの場合

json
{
  "scripts": {
    "production": "cross-env NODE_ENV=production NODE_OPTIONS=--openssl-legacy-provider node_modules/webpack/bin/webpack.js --config=node_modules/laravel-mix/setup/webpack.config.js"
  }
}

推奨される解決策

  1. まずWebpackを最新バージョンに更新し、xxhash64アルゴリズムを使用することをおすすめします
  2. どうしても更新できない場合、Node.js 16 LTSを使用するのが安全です
  3. 一時的な解決策として環境変数での設定も有効ですが、永続的な解決策ではありません

まとめ

ERR_OSSL_EVP_UNSUPPORTEDエラーはNode.js 17とWebpackの互換性問題によるものです。最新のWebpackを使用して現代的なハッシュアルゴリズムに移行するのが最も良い解決策です。プロジェクトの状況に応じて、適切な解決方法を選択してください。