本文へスキップ
ecdsa.com
Node.js 17+ (OpenSSL 3)Node.js の crypto

エラーメッセージ

error:0308010C:digital envelope routines::unsupported

Node.js 17+ (OpenSSL 3) — code ERR_OSSL_EVP_UNSUPPORTED

このエラーの意味

あるコードが、OpenSSL 3 の既定のプロバイダーがもう提供していないアルゴリズムを要求しました。最もよく知られているのは MD4 で、古いバージョンの webpack がビルド時のハッシュ計算に使っています。Node 17 で OpenSSL 3 に切り替わり、レガシーなダイジェストや暗号は、デフォルトで無効になっている別の「legacy」プロバイダーに移されました。エラーが示すのは仕組み(デジタルエンベロープ層である EVP)であって、原因となったコードではありません。廃止されたアルゴリズムを OpenSSL 3 に要求すればどこでも同じコードが出ますが、発生例の圧倒的多数は webpack と Node 17 以降の組み合わせによるものです。

発生する理由

修正方法

  1. 1.

    ツールチェーンをアップグレードする(本当の解決策)

    webpack 5.61 以降(4.x 系では 4.47)は、OpenSSL が MD4 を提供しなくなった場合、WASM による MD4 の実装にフォールバックします。react-scripts 5 にはこれが含まれています。問題を覆い隠すのではなく、取り除く方法です。

    bash
    npm install --save-dev webpack@latest
    # CRA projects:
    npm install --save-dev react-scripts@5
  2. 2.

    応急処置:legacy プロバイダーを有効にする

    MD4 などのアルゴリズムをプロセス全体で再び有効にします。今日のビルドを通すためなら許容できますが、恒久的な設定にしてはいけません。プロセス内のすべてのコードが、破られたアルゴリズムを再び使える状態になるためです。

    bash
    NODE_OPTIONS=--openssl-legacy-provider npm run build
  3. 3.

    自分のコードではアルゴリズムを置き換える

    暗号用途ではないフィンガープリントの計算には、最新のダイジェストならどれでも使えます。署名を検証するコードは、そもそも MD4/MD5 を使うべきではありません。

    js
    // before: createHash("md4")
    import { createHash } from "node:crypto";
    const digest = createHash("sha256").update(data).digest("hex");

関連するエラー

署名エラーデータベースをすべて見る