La compilación del paquete web falla con ERR_OSSL_EVP_UNSUPPORTED [duplicado]
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 webpack
lo 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?
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 start
funciona con -openssl-legacy-provider
, pero npm run dev
no lo hará.
Parece que hay un parche: Node.js 17: rutinas de sobre digital::unsupported #14532
Personalmente bajé la categoría a 16-alpine
.
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.
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),
});
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.cnf
con 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_CONF
en la ruta a ese archivo cuando ejecute Webpack.
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 output
clave webpack.config.cjs para incluir la hashFunction: "xxhash64"
opción.
module.exports = {
output: {
hashFunction: "xxhash64"
}
};
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.