Сообщение об ошибке
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+.
Почему это происходит
Старые инструменты сборки, запрашивающие MD4
частоwebpack 4 до версии 4.46 включительно (и привязанные к нему инструменты: react-scripts 4, vue-cli 4, старые версии Angular) по умолчанию хеширует модули с помощью MD4. В Node ≥17 первый же шаг сборки падает с этой ошибкой. В трассировке стека обычно виден createHash внутри webpack. В webpack 4.47.0 добавили тот же запасной механизм, что и в 5.61, поэтому последний релиз webpack 4 снова собирает проекты.
Код приложения, использующий устаревшие примитивы
иногдаПрямые вызовы вроде createHash("md4"), createCipheriv с RC4/DES/Blowfish или зависимости, которые делают то же самое. Эти алгоритмы криптографически взломаны, и их намеренно вынесли из провайдера по умолчанию.
Очень старые файлы PKCS#12 и хранилищ ключей
редкоСтарые файлы .p12/.pfx, зашифрованные по схемам на основе RC2/RC4, упираются в то же ограничение при загрузке в системах с OpenSSL 3: openssl pkcs12 без -legacy выдаёт этот код и называет RC2-40-CBC. Собственная функция Node tls.createSecureContext() отклоняет тот же файл с другим сообщением: «Unsupported PKCS12 PFX data».
Как исправить
- 1.
Обновите инструменты сборки (настоящее решение)
webpack ≥ 5.61 (и 4.47 в ветке 4.x) переключается на WASM-реализацию MD4, когда OpenSSL её больше не предоставляет; в react-scripts 5 такая версия уже входит. Это устраняет проблему, а не маскирует её.
bash npm install --save-dev webpack@latest # CRA projects: npm install --save-dev react-scripts@5 - 2.
Временная мера: включите провайдер legacy
Снова включает MD4 и подобные алгоритмы для всего процесса. Это допустимый способ разблокировать сборку прямо сейчас, но не оставляйте его навсегда: взломанные алгоритмы снова становятся доступны всему коду в процессе.
bash NODE_OPTIONS=--openssl-legacy-provider npm run build - 3.
В собственном коде замените алгоритм
Для некриптографических отпечатков подойдёт любой современный хеш, а то, что проверяет подписи, вообще не следует строить на MD4/MD5.
js // before: createHash("md4") import { createHash } from "node:crypto"; const digest = createHash("sha256").update(data).digest("hex");