错误:error:0308010C:digital envelope routines::unsupported at new Hash (node:internal/crypto/hash:71:19)。

29
在构建我的React Docker镜像后,我尝试运行docker run image_name,然后日志抛出了这个错误。
Error: error:0308010C:digital envelope routines::unsupported
    at new Hash (node:internal/crypto/hash:71:19)
    at Object.createHash (node:crypto:133:10)
    at module.exports (/app/node_modules/webpack/lib/util/createHash.js:135:53)
    at NormalModule._initBuildHash (/app/node_modules/webpack/lib/NormalModule.js:417:16)
    at /app/node_modules/webpack/lib/NormalModule.js:452:10
    at /app/node_modules/webpack/lib/NormalModule.js:323:13
    at /app/node_modules/loader-runner/lib/LoaderRunner.js:367:11
    at /app/node_modules/loader-runner/lib/LoaderRunner.js:233:18
    at context.callback (/app/node_modules/loader-runner/lib/LoaderRunner.js:111:13)
    at /app/node_modules/babel-loader/lib/index.js:59:103 {
  opensslErrorStack: [ 'error:03000086:digital envelope routines::initialization error' ],
  library: 'digital envelope routines',
  reason: 'unsupported',
  code: 'ERR_OSSL_EVP_UNSUPPORTED'
}

我的Docker文件如下:
FROM node:18-alpine
EXPOSE 3000
WORKDIR /app
COPY ./frontend/package.json .
RUN npm install
COPY ./frontend .
COPY ./images .
CMD ["npm", "start"]

我认为这可能是与节点版本有关的问题,但我对错误不是非常确定,有人能解释一下这个错误是什么以及如何解决吗?谢谢!


1
这个回答解决了你的问题吗?错误信息“error:0308010C:digital envelope routines::unsupported” - Michael Freidgeim
1
作为一个环境变量,NODE_OPTIONS=--openssl-legacy-provider 对我很有效... - J Decker
10个回答

25

3
我得到了:electron: --openssl-legacy-provider 在 NODE_OPTIONS 中不被允许 - JJoao
2
"start": "react-scripts --openssl-legacy-provider start",这对我来说就可以了。 - Noud
降级节点或使用传统提供商都不是安全的选择。 - davidgoli

12

开始你的应用程序:

package.json中更新你的启动脚本以使用

react-scripts --openssl-legacy-provider start

构建应用程序:

请在package.json中更新你的构建脚本以使用。

react-scripts --openssl-legacy-provider build

8

我在Heroku上遇到了同样的问题。在构建阶段,我遇到了相同的错误。为了解决这个问题,我只需要将其设置为环境变量:

NODE_OPTIONS="--openssl-legacy-provider"

4

经过深入搜索,我找到了这个解决方案。

问题是什么? 问题在于我的Node版本和React js版本之间的差异。

Node.js v18.4.0
"react":"^16.12.0"

解决方案:

  1. 确保您的计算机上安装了nvm,如果没有,请访问此链接Node Version Manager
  2. 在您的项目终端中键入:nvm ls(您应该看到如下所示的列表) nvm ls
  3. 键入:nvm use v16.15.1 选择适合您的版本

如果您没有安装任何nvm

注意:安装nvm后,您必须重新启动终端或关闭并打开终端才能查看nvm版本


1
你可以直接使用 Node v16,尝试使用 NVM 轻松切换版本。

1

在使用 Angular v 12.2.14 时,我在我的机器上安装了最新的 Node 版本/18.15 后遇到了这个错误。因此,我应该卸载最新版本的 Node 并降级为与 Angular 版本兼容的旧版本/v14.21.3。使用: https://unpkg.com/browse/@angular/core@12.0.0/package.json 进行兼容性检查。


类似问题: 我的全局 Angular 项目(CLI 14 和 15)以及整个机器都使用 Node V18,而导致此错误的项目是使用 Angular CLI V11 编写的。您认为将整个全局 Node 降级到例如 V16 是一个更好的主意吗? 或者可能升级此项目的 Node 或其他东西? - Jacob Okello Okomo
1
@JacobOkelloOkomo,请确保没有其他项目使用全局版本,并首先检查兼容性链接。 - Naod Agere

0

我更改了节点版本node:16.3.0-alpine,它可以工作。 但是,有人能解释一下数字信封例程吗?


这个网站给出了一个相当不错的解释:https://itsmycode.com/error-digital-envelope-routines-unsupported/ - jumptiger13

0

原因

在 Node 17.x 版本之前,它使用 OpenSSL 2 版本。NodeJS 使用 OpenSSL 实现哈希功能代码。由于 OpenSSL 3 禁用了 MD4,因此在最新的 NodeJS 版本中 NodeJS 被破坏了。

解决方法

  1. Linux 用户

export NODE_OPTIONS=--openssl-legacy-provider

  1. Windows 用户

set NODE_OPTIONS=--openssl-legacy-provider

  1. 您可以将 NODE_OPTIONS=--openssl-legacy-provider 添加到 npm 脚本中。

0
所以,我在进行开发时运行了npm run dev命令,我的package.json文件如下:
 "scripts": {
    "dev": "next dev",
...

所以,我把那行改成了:
  "scripts": {
    "dev": "node --openssl-legacy-provider ./node_modules/.bin/next dev",

而且它像魔法一样起作用。

-2

请检查 package.json 文件,在脚本下方我有以下内容:

"scripts": { "start": "expo start", "android": "expo start --android", "ios": "expo start --ios", "web": "expo start --web" }

在终端中运行以下命令:

expo start -web


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接