问题背景

当你使用 Node.js 与一些较旧的服务器(特别是 IIS)建立 HTTPS 连接时,可能会遇到以下错误:

SSL routines:final_renegotiate:unsafe legacy renegotiation disabled

这个错误源于一个已知的安全漏洞 CVE-2009-3555,Node.js 从版本 17/18 开始移除了对不安全旧版 SSL 重新协商的支持,以增强安全性。

问题根源

CVE-2009-3555 安全漏洞

该漏洞允许攻击者在 SSL/TLS 会话中注入任意明文,可能导致会话劫持和其他安全问题。因此,现代 Node.js 版本默认禁用了这种不安全的旧版重新协商方式。

IIS 服务器的兼容性问题

许多旧版 IIS 服务器仍然使用这种不安全的重新协商方式,而 Node.js 的默认配置不再允许这种连接。这就是为什么你会遇到这个错误,即使尝试使用 Node.js 标志也无法忽略它。

解决方案

使用自定义 HTTPS Agent 允许旧版连接

对于必须与这些旧服务器通信的情况,可以通过创建自定义 HTTPS Agent 来允许旧版 SSL 连接:

import crypto from 'crypto';
import https from 'https';
import axios from 'axios'; const allowLegacyRenegotiationforNodeJsOptions = {
httpsAgent: new https.Agent({
secureOptions: crypto.constants.SSL_OP_LEGACY_SERVER_CONNECT,
}),
}; export const request = axios.create({
...allowLegacyRenegotiationforNodeJsOptions,
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
},
// ...
});

方案说明

  1. crypto.constants.SSL_OP_LEGACY_SERVER_CONNECT

    这个选项明确告诉 Node.js 允许与使用旧版 SSL 重新协商的服务器建立连接。

  2. 自定义 HTTPS Agent

    通过创建自定义的 https.Agent,我们可以覆盖默认的安全设置,同时保持其他安全功能不变。

安全注意事项

虽然这个解决方案可以解决问题,但需要注意:

  1. 安全风险

    启用旧版重新协商会降低连接的安全性,可能使你的应用面临中间人攻击等风险。

  2. 临时解决方案

    这应该被视为临时解决方案,长期来看应该升级服务器端以支持现代 SSL/TLS 协议。

  3. 范围限制

    尽量只对特定的、必要的连接启用此选项,而不是全局设置。

替代方案

如果可能,考虑以下更安全的替代方案:

  1. 升级服务器

    将 IIS 服务器升级到支持现代 TLS 协议的版本。

  2. 使用代理

    在中间层设置一个代理服务器,处理与旧服务器的安全连接,而你的 Node.js 应用则与代理使用现代协议通信。

  3. 联系服务提供商

    如果是第三方服务,联系他们升级其 SSL/TLS 配置。

总结

当遇到 "SSL routines:final_renegotiation:unsafe legacy renegotiation disabled" 错误时,可以通过创建自定义 HTTPS Agent 并设置 SSL_OP_LEGACY_SERVER_CONNECT 选项来解决与旧版服务器的兼容性问题。但请记住,这只是一个临时解决方案,从安全角度考虑,应该尽快升级服务器端以支持现代安全协议。

在实施此解决方案时,务必评估潜在的安全风险,并尽可能限制其使用范围,只在绝对必要的情况下启用旧版 SSL 重新协商支持。

解决 Node.js 中 "SSL routines:final_renegotiate:unsafe legacy renegotiation disabled" 错误的更多相关文章

  1. scrapy出现SSL问题 如何解决? <twisted.python.failure.Failure OpenSSL.SSL.Error: [('SSL routines', '', 'unsafe legacy renegotiation disabled')]>

    问题:<twisted.python.failure.Failure OpenSSL.SSL.Error: [('SSL routines', '', 'unsafe legacy renego ...

  2. Node.js中针对中文的查找和替换无效的解决方法

    Node.js中针对中文的查找和替换无效的解决方法.   //tags的值: tag,测试,帖子 var pos1 = tags.indexOf("测"); //这里返回-1 ta ...

  3. 在Node.js中使用RabbitMQ系列二 任务队列

    在上一篇文章在Node.js中使用RabbitMQ系列一 Hello world我有使用一个任务队列,不过当时的场景是将消息发送给一个消费者,本篇文章我将讨论有多个消费者的场景. 其实,任务队列最核心 ...

  4. node.js中对 redis 的安装和基本操作

    一.win下安装redis https://github.com/MicrosoftArchive/redis/releases 下载Redis-x64-3.2.100.zip,然后解压,放到自定义目 ...

  5. node.js中stream流中可读流和可写流的使用

    node.js中的流 stream 是处理流式数据的抽象接口.node.js 提供了很多流对象,像http中的request和response,和 process.stdout 都是流的实例. 流可以 ...

  6. Node.js中环境变量process.env详解

    Node.js中环境变量process.env详解process | Node.js API 文档http://nodejs.cn/api/process.html官方解释:process 对象是一个 ...

  7. Node.js中Process.nextTick()和setImmediate()的区别

    一.Webstrom使用node.js IDE的问题 在区别这两个函数之前来说一下Webstrom使用node.js IDE的问题,在配置Node.js的IDE了,但setImmediate().re ...

  8. node.js中实现同步操作的3种实现方法

    这篇文章主要介绍了node.js中实现同步操作的3种实现方法,本文用实例讲解一些需要同步操作的情况下,如何编程实现,需要的朋友可以参考下 众所周知,异步是得天独厚的特点和优势,但同时在程序中同步的需求 ...

  9. 解决 Node.js 错误 Error:listen EADDRINUSE

    第一次尝试 node.js 中的 express 框架,写了第一个 js 文件之后,在 WebStorm 运行,到游览器刷新,成功运行. 又创建一个 js 文件,写的是静态路由的访问,结果出现了 Er ...

  10. node.js中http通讯模块

    创建一个服务器 首先建立一个js文件,命名为app.js写入内容: const http=require('http'); http.createServer((request,response)=& ...

随机推荐

  1. 【FAQ】HarmonyOS SDK 闭源开放能力 —Vision Kit (3)

    1.问题描述: 通过CardRecognition识别身份证拍照拿到的照片地址,使用该方法获取不到图片文件,请问如何解决? 解决方案: //卡证识别实现页,文件名为CardDemoPage,需被引入至 ...

  2. Longest Substring Without Repeating Characters---LeetCode进阶路③

    题目描述 Given a string, find the length of the longest substring without repeating characters. Example ...

  3. C++项目提示“error MSB4019: 找不到导入的项目”

    报错:C:\Users\DELL\Desktop\PD Manager-20240912(1)\PD Manager\PD Manager\PD Manager.vcxproj(66,5): erro ...

  4. mysql安装配置启动

    1. 安装 & 配置 & 启动 MySQL现在的版本主要分为: 5.x 版本,现在互联网企业中的主流版本,包括:头条.美图.百度.腾讯等互联网公司主流的版本. 8.x 版本,新增了一些 ...

  5. docker pull镜像加速

    配置说明 $ vim /etc/docker/daemon.json { "registry-mirrors": [ "https://ustc-edu-cn.mirro ...

  6. VKProxy已提供命令行工具,镜像和简单的ui

    VKProxy 是使用c#开发的基于 Kestrel 实现 L4/L7的代理 经过6个月业余时间偶尔缝缝补补,已经达到能跑的地步了 (感兴趣的同学烦请点个github小赞赞呢) 相关使用写了一些简单的 ...

  7. [Java/字节流/BytesReader] 核心源码精讲: ByteArrayInputStream(字节数组输入流)

    概述 : ByteArrayInputStream(字节数组输入流) 简介 字节数组输入流在内存中创建一个字节数组缓冲区,从输入流读取的数据保存在该字节数组缓冲区中. java.io.ByteArra ...

  8. 提前完成今年flag😍

    大半夜的头脑一热就冲上去了,其实很多年前就该这样做的,算是给以前的自己一个答复吧

  9. 【工厂和策略设计模式妙用】解决接口选择与多重if-else 问题

    利用工厂和策略模式解决接口选择与多重if-else问题 在软件开发中,我们经常会遇到需要根据不同的条件选择不同实现的情况.传统的if-else或switch-case方式虽然直观,但随着业务逻辑复杂度 ...

  10. IPC通信

    参考 linux 网络编程第二版 敲 发现 出错了... ... 网上也没有特别多的参考程序.后来在 man msgrcv 里面找到了参考程序 #include <stdio.h> #in ...