C
Node.js検証済み

Error message "error:0308010C:digital envelope routines::unsupported" の原因と直し方【Dockerで検証済み】

Error message "error:0308010C:digital envelope routines::unsupported" の原因と解決方法。検証済みの解決コマンド付きで、現象→原因→解決→確認の順に最短で直せます。

発生したエラー

エラー出力
Error message "error:0308010C:digital envelope routines::unsupported"

結論:まずこれで直ります

下の解決コマンドを順に実行すれば直ります。

解決コマンド
cd /app
export NODE_OPTIONS=--openssl-legacy-provider
npm install webpack webpack-cli@5
cat > webpack.config.js << 'EOF'
const path = require('path');
module.exports = {
  entry: './src/index.js',
  output: { filename: 'bundle.js', path: path.resolve(__dirname, 'dist') },
  mode: 'development'
};
EOF

現象どんなエラーか

次の操作を行うと(検証環境: node:20)、上記のエラーが発生します。まずは下の再現コマンドで、同じ状況を再現できることを確認してください。

検証環境:node:20

再現コマンド
mkdir -p /app && cd /app && cat > webpack.config.js << 'EOF'
const path = require('path');
module.exports = {
  entry: './src/index.js',
  output: { filename: 'bundle.js', path: path.resolve(__dirname, 'dist') },
  mode: 'development'
};
EOF
mkdir -p src && echo "console.log('hello');" > src/index.js
npm init -y
npm install webpack webpack-cli@4
node --openssl-legacy-provider=false -e "require('crypto').createHash('md4').update('test').digest('hex')" 2>&1 || true
node -e "
const crypto = require('crypto');
try {
  crypto.createHash('md4');
} catch(e) {
  console.error(e.message);
  process.exit(1);
}
"

原因なぜ起きるのか

このエラーは Node.js 17 以降で OpenSSL 3.x が採用されたことにより、MD4 など OpenSSL 3 で廃止・非サポートとなったハッシュアルゴリズムを古いバージョンの webpack(特に webpack 4 系)や一部のローダーが内部的に使用しようとした際に発生します。 根本原因は2つあります。①古い webpack/webpack-cli が OpenSSL 3 で削除されたアルゴリズムに依存している。②Node.js 17+ のデフォルト設定では OpenSSL レガシープロバイダが無効になっている。 推奨される解決策は優先度順に以下の通りです。 1. **webpack を最新版(5系)にアップグレードする(最も推奨)**: webpack 5 は OpenSSL 3 対応のハッシュアルゴリズムを使用するため、このエラーは発生しません。 2. **短期的な回避策として `NODE_OPTIONS=--openssl-legacy-provider` を設定する**: 環境変数でレガシープロバイダを有効にすることで、旧来のアルゴリズムを引き続き使えるようにします。package.json の scripts に組み込む場合は `"build": "NODE_OPTIONS=--openssl-legacy-provider webpack"` のように記述します。ただしこれはあくまで移行期の暫定対応であり、根本的にはライブラリのアップグレードが必要です。 Create React App や Angular CLI のような上位フレームワークを使っている場合は、そのフレームワーク自体を最新版にアップグレードすることで webpack も一緒に更新されます。

解決解決手順

修正コマンド
cd /app
export NODE_OPTIONS=--openssl-legacy-provider
npm install webpack webpack-cli@5
cat > webpack.config.js << 'EOF'
const path = require('path');
module.exports = {
  entry: './src/index.js',
  output: { filename: 'bundle.js', path: path.resolve(__dirname, 'dist') },
  mode: 'development'
};
EOF

確認直ったか確認する

確認コマンド
cd /app && NODE_OPTIONS=--openssl-legacy-provider npx webpack --config webpack.config.js && test -f dist/bundle.js && echo 'Build succeeded' && exit 0 || exit 1

動画で見る

この記事の解決手順は実環境で検証しています

山田 英紀(社内SE 5年以上・13業種以上の業務システムを開発/運用)が、 掲載コマンドを検証環境で実行し、再現〜解決〜確認まで通ることを確認しています。

この手順でも直らない・自社の環境で再現する場合

エラー調査・修正から、業務システムの改善までご相談いただけます。

無料で相談する

関連する記事