I am building a Gatsby site. I upgraded Node.js to v17.0.1, and when I run a build, there is an error:
Error: digital envelope routines::unsupported
opensslErrorStack: [ 'error:03000086:digital envelope routines::initialization error' ],
library: 'digital envelope routines',
reason: 'unsupported',
code: 'ERR_OSSL_EVP_UNSUPPORTED'
If I downgrade it to v16, it works fine, and the build will be successful. How can I fix this?
From googling, this may be a similar issue: Error: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt #48
This might help. Add these scripts in the package.json file.
"scripts": {
"start": "export SET NODE_OPTIONS=--openssl-legacy-provider && react-scripts start",
"build": "export SET NODE_OPTIONS=--openssl-legacy-provider && react-scripts build"
}
or
"scripts": {
"start": "react-scripts --openssl-legacy-provider start",
"build": "react-scripts --openssl-legacy-provider build",
}
"scripts": {
"serve": "export NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve",
"build": "export NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service build",
"lint": "export NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service lint"
},
or
"scripts": {
"serve": "vue-cli-service --openssl-legacy-provider serve",
"build": "vue-cli-service --openssl-legacy-provider build",
"lint": "vue-cli-service --openssl-legacy-provider lint"
},
Gatsby must be using an algorithm or key size that is no longer allowed by default with OpenSSL 3.0.
UPDATE ⚠️
This is most likely a webpack issue: https://github.com/webpack/webpack/issues/14532
They have since released a fix in version 5.61.0 : https://github.com/webpack/webpack/releases/tag/v5.61.0 , so updating webpack should also fix the problem.
A member of the webpack team has stated that they don't plan to back up the solution to webpack 4, so if you're on webpack 4, you may need to look at upgrading to webpack 5 first.
From the Node.js 17 announcement post :
If you encounter an
ERR_OSSL_EVP_UNSUPPORTEDerror in your application with Node.js 17, it is likely that your application or a module you are using is trying to use an algorithm or key size that is no longer allowed by default with OpenSSL 3.0. Added a new command line option--openssl-legacy-provider, to fall back to the legacy provider as a workaround for these strict restrictions.
Running this in the terminal might look like this:
node --openssl-legacy-provider ./node_modules/.bin/gatsby buildYou can also pass this through the NODE_OPTIONS environment variable.
So if you want to continue using the npm script, you can change the build script to:
// package.json { "scripts": { "build": "export NODE_OPTIONS=--openssl-legacy-provider; gatsby build" } }Quick fix: Run this in a terminal inside your React project.
export NODE_OPTIONS=--openssl-legacy-provider