La compilación del paquete web falla con ERR_OSSL_EVP_UNSUPPORTED [duplicado]

Resuelto Ryan Brownell asked hace 3 años • 0 respuestas

Tengo un problema con un proceso de compilación de Webpack que de repente se interrumpió, lo que provocó el siguiente error...

<s> [webpack.Progress] 10% building 0/1 entries 0/0 dependencies 0/0 modules
node:internal/crypto/hash:67
  this[kHandle] = new _Hash(algorithm, xofLen);
                  ^

Error: error:0308010C:digital envelope routines::unsupported
    at new Hash (node:internal/crypto/hash:67:19)
    at Object.createHash (node:crypto:130:10)
    at BulkUpdateDecorator.hashFactory (/app/node_modules/webpack/lib/util/createHash.js:155:18)
    at BulkUpdateDecorator.update (/app/node_modules/webpack/lib/util/createHash.js:46:50)
    at OriginalSource.updateHash (/app/node_modules/webpack-sources/lib/OriginalSource.js:131:8)
    at NormalModule._initBuildHash (/app/node_modules/webpack/lib/NormalModule.js:888:17)
    at handleParseResult (/app/node_modules/webpack/lib/NormalModule.js:954:10)
    at /app/node_modules/webpack/lib/NormalModule.js:1048:4
    at processResult (/app/node_modules/webpack/lib/NormalModule.js:763:11)
    at /app/node_modules/webpack/lib/NormalModule.js:827:5 {
  opensslErrorStack: [ 'error:03000086:digital envelope routines::initialization error' ],
  library: 'digital envelope routines',
  reason: 'unsupported',
  code: 'ERR_OSSL_EVP_UNSUPPORTED'
}
command terminated with exit code 1

Intenté buscar en Google, ERR_OSSL_EVP_UNSUPPORTED webpacklo que casi no arrojó resultados útiles, pero destacó un problema al usar MD4 proporcionado por OpenSSL (¿que aparentemente está obsoleto?) Para generar hashes.

El código webpack.config.js es el siguiente:

const path = require('path');
const webpack = require('webpack');

/*
 * SplitChunksPlugin is enabled by default and replaced
 * deprecated CommonsChunkPlugin. It automatically identifies modules which
 * should be splitted of chunk by heuristics using module duplication count and
 * module category (i. e. node_modules). And splits the chunks…
 *
 * It is safe to remove "splitChunks" from the generated configuration
 * and was added as an educational example.
 *
 * https://webpack.js.org/plugins/split-chunks-plugin/
 *
 */

/*
 * We've enabled TerserPlugin for you! This minifies your app
 * in order to load faster and run less javascript.
 *
 * https://github.com/webpack-contrib/terser-webpack-plugin
 *
 */

const TerserPlugin = require('terser-webpack-plugin');

module.exports = {
    mode: 'development',
    entry: './src/js/scripts.js',

    output: {
        path: path.resolve(__dirname, 'js'),
        filename: 'scripts.js'
    },

    devtool: 'source-map',

    plugins: [new webpack.ProgressPlugin()],

    module: {
        rules: []
    },

    optimization: {
        minimizer: [new TerserPlugin()],

        splitChunks: {
            cacheGroups: {
                vendors: {
                    priority: -10,
                    test: /[\\/]node_modules[\\/]/
                }
            },

            chunks: 'async',
            minChunks: 1,
            minSize: 30000,
            name: 'true'
        }
    }
};

¿Cómo cambio el algoritmo hash utilizado por Webpack por otro?

Ryan Brownell avatar Sep 30 '21 22:09 Ryan Brownell
Aceptado

Pude solucionarlo a través de:

export NODE_OPTIONS=--openssl-legacy-provider

Comentario de sachaw sobre Node.js v17.0.0: error al iniciar el proyecto en modo de desarrollo #30078

Pero dicen que lo arreglaron: comentario de ijjk sobre Node.js v17.0.0 - Error al iniciar el proyecto en modo de desarrollo #30078 :

Hola, esto se actualizó en v11.1.3-canary.89 de Next.js, actualícelo y pruébelo.

Para mí, funcionó sólo con la anotación anterior.

También quiero señalar que npm run startfunciona con -openssl-legacy-provider, pero npm run devno lo hará.

Parece que hay un parche: Node.js 17: rutinas de sobre digital::unsupported #14532

Personalmente bajé la categoría a 16-alpine.

Jan avatar Oct 28 '2021 00:10 Jan

También tuve este problema. Accidentalmente había estado ejecutando la última versión de Node.js (17.0 al momento de escribir este artículo), no la versión LTS (14.18) que tenía intención de instalar. Degradar mi instalación de Node.js a la versión LTS solucionó el problema.

Benjamin Hodgson avatar Oct 19 '2021 20:10 Benjamin Hodgson

En realidad, no es mi respuesta, pero encontré esta solución alternativa /hack/ para solucionar mi problema. Registro de código para un proyecto de GitHub ... vea los comentarios de error aquí .

Me encontré con ERR_OSSL_EVP_UNSUPPORTED después de actualizar con npm install .

Agregué lo siguiente a node_modules\react-scripts\config\webpack.config.js

const crypto = require("crypto");
const crypto_orig_createHash = crypto.createHash;
crypto.createHash = algorithm => crypto_orig_createHash(algorithm == "md4" ? "sha256" : algorithm);

Probé la solución de Ryan Brownell y terminé con un error diferente, pero funcionó...


Equivalente mecanografiado:

import crypto from "crypto";

const crypto_orig_createHash = crypto.createHash;
Object.assign(crypto, {
  createHash: (algorithm: string): crypto.Hash => crypto_orig_createHash(algorithm === "md4" ? "sha256" : algorithm),
});
Cheshiremoe avatar Oct 23 '2021 19:10 Cheshiremoe

La respuesta de Ryan Brownell es la solución ideal si está utilizando Webpack v5.54.0+.

Si está utilizando una versión anterior de Webpack, aún puede resolver este problema cambiando la función hash a una que no esté obsoleta. (El valor predeterminado es el antiguomd4 , para el cual OpenSSL ha eliminado el soporte, que es la causa principal del error). Los algoritmos admitidos son todos los admitidos por crypto.createHash . Por ejemplo, para usar SHA-256 :

module.exports = {
    output: {
        hashFunction: "sha256"
    }
};

Finalmente, si no puede cambiar la configuración de Webpack (por ejemplo, si es una dependencia transitiva que ejecuta Webpack), puede habilitar el proveedor heredado de OpenSSL para habilitar temporalmente MD4 durante la compilación de Webpack. Este es un último recurso. Crea un archivo openssl.cnfcon este contenido…

openssl_conf = openssl_init

[openssl_init]
providers = provider_sect

[provider_sect]
default = default_sect
legacy = legacy_sect

[default_sect]
activate = 1

[legacy_sect]
activate = 1

…y luego establezca la variable de entorno OPENSSL_CONFen la ruta a ese archivo cuando ejecute Webpack.

jbg avatar Oct 07 '2021 06:10 jbg

Hay un algoritmo hash que viene con Webpack v5.54.0+ que no depende de OpenSSL.

Para utilizar esta función hash que se basa en una dependencia proporcionada por npm en lugar de una dependencia proporcionada por el sistema operativo, modifique la outputclave webpack.config.cjs para incluir la hashFunction: "xxhash64"opción.

module.exports = {
    output: {
        hashFunction: "xxhash64"
    }
};
Ryan Brownell avatar Sep 30 '2021 15:09 Ryan Brownell

Este error se menciona en las notas de la versión de Node.js 17.0.0, con una solución alternativa sugerida:

Si encuentra un error ERR_OSSL_EVP_UNSUPPORTED en su aplicación con Node.js 17, es probable que su aplicación o un módulo que está utilizando esté intentando utilizar un algoritmo o tamaño de clave que ya no está permitido de forma predeterminada con OpenSSL 3.0. Se agregó una opción de línea de comandos, --openssl-legacy-provider , para volver al proveedor heredado como solución temporal para estas restricciones más estrictas.

Patrik Erdes avatar Oct 22 '2021 06:10 Patrik Erdes