允许NodeJ的旧版重新协商

t0ybt7op  于 2022-11-29  发布在  Node.js
关注(0)|答案(1)|浏览(144)

解决这个问题的最好方法是更新我试图连接的SSL端点,但我也没有这个能力。
我正在尝试访问一个应用程序的SOAP端点(这很痛苦),该应用程序正在进行大量的维护,因此可能无法获得正确的SSL补丁。
它位于正在执行主动SSL重写的代理后面,也可能是错误的原因:

var request = require("request")
var soap = require("soap")
const fs = require('fs')

var specialRequest = request.defaults({
  ca: fs.readFileSync("rewrite-example.pem")
})

var options = { request: specialRequest }

const WSDL = "https://SSL-rewrite.example?wsdl"

soap.createClient(WSDL, options, function(err, client) {
        if(err) throw Error(err)
})

错误:

Uncaught TypeError: req.then is not a function
    at HttpClient.request (../node_modules/soap/lib/http.js:191:13)
    at Object.open_wsdl (../node_modules/soap/lib/wsdl/index.js:1271:20)
    at openWsdl (../node_modules/soap/lib/soap.js:70:16)
    at ../node_modules/soap/lib/soap.js:48:13
    at _requestWSDL (../node_modules/soap/lib/soap.js:76:9)
    at Object.createClient (../node_modules/soap/lib/soap.js:94:5)
> Uncaught: Error: write EPROTO C017726B8C7F0000:error:0A000152:SSL routines:final_renegotiate:unsafe legacy renegotiation disabled:../deps/openssl/openssl/ssl/statem/extensions.c:908

根据我找到的here,可以创建一个允许不安全的遗留重新协商的自定义OpenSSL配置文件。使用Node的--openssl-config标志,应该可以“忽略”重新协商。我尝试过像在第一个链接中写的那样写一个自定义配置文件并将其传入,但没有效果。
这个问题已经被问到before,尽管恢复到节点的旧版本并不理想。
还有什么其他方法可以解决这个问题?

46scxncf

46scxncf1#

由于您已经发现此错误来自CVE-2009-3555,这是IIS的问题,所以它甚至不会被忽略使用节点标志.由于节点17或18他们删除了OpenSSL选项接受旧版服务器.
在您的情况下,更好的解决方案是使用选项传递httpsAgent。根据自述文件,soap.js使用v0.40.0的Axios,因此您应该如下设置请求参数:

const crypto = require('crypto')

const options = {
  request: axios.create({
      // axios options
      httpsAgent: new https.Agent({
        // for self signed you could also add
        // rejectUnauthorized: false,

        // allow legacy server
        secureOptions: crypto.constants.SSL_OP_LEGACY_SERVER_CONNECT,
      }),
    }),
  }

代理的secureOptions是SSL_OP_*选项的数字位掩码。

相关问题