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業種以上の業務システムを開発/運用)が、 掲載コマンドを検証環境で実行し、再現〜解決〜確認まで通ることを確認しています。