Node.jsの暗号方式unsupported対処法
冒頭まとめ Node.jsの更新後、npm run buildなどで次のエラーが出ることがあります。 Error: error:0308010C:digital envelope routines::unsupported code: 'ERR_OSSL_EVP_UNSUPPORTED' OpenSSLは、Node.jsが暗号処理などに使う部品です。このエラーは、OpenSSLの現在の設定で使えない方式などを呼び出した場合に起こります。古いwebpackでは、ファイルを識別する値の計算に使うMD4が原因になる例があります。 まず、エラーの実行履歴に出るパッケージと、その版を確認してください。更新で原因を取り除くのが本来の対応です。--openssl-legacy-providerは、古い方式を利用可能にする一時的な回避策です。 Node.jsの更新で表面化する理由 Node.js 17.0.0の公式リリース説明は、OpenSSL 3.0の導入と、利用できる方式や鍵の長さの制限変更を説明しています。同じ説明は、ERR_OSSL_EVP_UNSUPPORTEDが出る場合、アプリや依存するモジュールが既定では許可されない方式などを使っている可能性が高いとしています。 ただし、Node.js 17以降なら必ずエラーになるわけではありません。呼び出す方式、依存するパッケージの実装、OpenSSLの設定によって結果が変わります。Node.jsをさらに新しくするだけで、古いMD4呼び出しが直るとも限りません。 この記事では、Node.js 24.19.0・OpenSSL 3.5.7で、MD4の直接呼び出しによる同じ文言を確認しました。通信先の証明書を検証するエラーとは区別します。 Node.jsと原因パッケージを確認する 失敗するプロジェクトの環境で、次を確認します。 node -v node -p "process.versions.openssl" npm ls webpack npm ls react-scripts @vue/cli-service 後半は、それらの道具を使っている場合の確認例です。npm lsでは、直接指定した依存だけでなく、別の道具が内部で使うwebpackも確認します。依存関係に問題があると、終了コードが非0になる場合があります。 エラーの下に並ぶ実行履歴も読みます。node:cryptoの直後にwebpack/lib/util/createHash.jsが出る場合と、別のloaderや自分のコードが出る場合では、更新する対象が異なります。 npx webpack --versionは、ローカルに実行対象がない場合に取得を促すことがあります。調査のために別のwebpackを取得するより、まず導入済みの依存関係を確認してください。 webpack本体と周辺の道具を更新する webpack 4.47.0のcreateHash実装では、md4指定に対し、Node.js 18以上ならwebpack自身のMD4実装を使います。18未満ではNode.jsのcrypto.createHashへ処理が渡ります。webpack 4でも、版と実行環境によって経路が異なります。 webpackを直接管理しているプロジェクトなら、webpackの移行ガイドを参照し、設定・loader・pluginを含めて更新します。webpack 4を維持する場合も、4.47.0の実装を確認したうえで、プロジェクトの対応範囲内で検証してください。 react-scriptsやVue CLIなどがwebpackを内部で管理している場合、webpackだけを追加しても、その道具の内部の依存が置き換わるとは限りません。管理元の道具と関連する依存を確認します。 webpack 5という大きな版番号だけでも判断できません。webpackのIssue #14532には、webpack 5.59.0・Node.js 17.0.0で同じエラーが出た報告があります。更新後は、エラーを出していた実際の処理が通るか確認します。 output.hashFunctionの公式説明にはハッシュ方式の指定があります。ただし、この設定がすべてのloaderやpluginの呼び出しを変えるわけではありません。設定を一か所変えれば必ず直るとは扱わないでください。 legacy指定は今回だけの回避に使う Node.jsの公式リリース説明は、legacy指定を一時的な回避策としています。Node.jsのコマンドライン文書にも、この指定が掲載されています。 macOS・Linuxのbashやzshでは、対象コマンドだけに環境変数を渡せます。 NODE_OPTIONS=--openssl-legacy-provider npm run build Windowsのコマンドプロンプトでは、現在の画面で設定して実行し、その後に解除します。以下は、既存のNODE_OPTIONSが空である場合の例です。 set "NODE_OPTIONS=--openssl-legacy-provider" npm run build set "NODE_OPTIONS=" PowerShellでは、同じく未設定の状態なら次を使えます。 ...