Skip to content

error:0308010C:digital envelope routines::unsupported エラーの解決方法

このエラーは、Node.js v17以降でプロジェクトを実行またはビルドしようとした際に発生する一般的な問題です。OpenSSLのセキュリティ更新が原因で、古い暗号化方式がサポートされなくなったことにより発生します。

問題の原因

Node.js v17以降では、OpenSSL 3.0が採用され、従来使用されていたMD4やMD5などの古いハッシュアルゴリズムのサポートが削除されました。しかし、Webpackやその他のビルドツールの一部のバージョンでは、これらのアルゴリズムに依存しているため、互換性の問題が発生します。

エラーメッセージのスタックトレース例:

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

推奨解決方法

方法1: 依存関係の更新(最も安全)

最も安全で推奨される解決方法は、プロジェクトの依存関係を更新することです。

bash
# 依存関係の更新を試みる
npm update

# 問題が解決しない場合、強制修復を試す
npm audit fix --force

WARNING

npm audit fix --force は破壊的な変更を含む可能性があるため、実行前にバージョン管理システムでの変更の確認を推奨します。

方法2: Webpackの設定変更

Webpackを使用している場合、ハッシュアルゴリズムを明示的に指定することで解決できます。

javascript
// webpack.config.js
module.exports = {
  // ... 他の設定
  output: {
    // ... 他のoutput設定
    hashFunction: 'sha256', // または 'xxhash64' (Webpack 5以上)
    hashDigest: 'base64'
  }
};

方法3: フレームワーク固有の解決策

Reactの場合

package.jsonのscriptsセクションを修正:

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

Vue.jsの場合

vue.config.jsに以下のコードを追加:

javascript
const crypto = require('crypto');

// MD4の代わりにMD5を使用する互換性対策
try {
  crypto.createHash('md4');
} catch (e) {
  console.warn('Crypto "MD4" is not supported anymore by this Node.js version');
  const origCreateHash = crypto.createHash;
  crypto.createHash = (alg, opts) => {
    return origCreateHash(alg === 'md4' ? 'md5' : alg, opts);
  };
}

Angularの場合

package.jsonのscriptsセクションを修正:

json
{
  "scripts": {
    "start": "set NODE_OPTIONS=--openssl-legacy-provider && ng serve -o"
  }
}

一時的な回避策(非推奨)

以下の方法はセキュリティリスクがあるため、あくまで一時的な対策としてのみ使用してください。

環境変数での回避

bash
# Unix系 (Linux, macOS, Git Bashなど)
export NODE_OPTIONS=--openssl-legacy-provider

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

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

.npmrcファイルでの設定

プロジェクトルートに**.npmrc**ファイルを作成:

node-options="--openssl-legacy-provider"

Node.jsのバージョン管理

nvm(Node Version Manager)を使用してNode.jsのバージョンを管理する方法:

bash
# nvmのインストール(未インストールの場合)
# https://github.com/nvm-sh/nvm を参照

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

# Node.js v16の使用
nvm use 16

# インストール済みバージョンの確認
nvm list

警告

Node.js v16は2023年9月にサポート終了となっているため、セキュリティ更新が提供されません。本番環境での使用は避けてください。

Docker環境での対応

Dockerを使用している場合、DockerfileでNode.jsのバージョンを指定:

dockerfile
# 非推奨: セキュリティリスクあり
FROM node:16

# 推奨: 最新のLTSバージョンを使用し、適切な設定を行う
FROM node:20

根本的な解決

長期的には、以下の対策を講じることを推奨します:

  1. すべての依存関係を最新版に更新
  2. 最新のLTS版Node.jsを使用
  3. フレームワークやビルドツールを最新版にアップデート
  4. 定期的なセキュリティ監査の実施

このエラーは、プロジェクトのセキュリティ状態を改善する機会と捉え、依存関係の現代化を推進することが最も安全で持続可能な解決策です。