Node.js SSL 错误:错误的版本号:../deps/openssl/openssl/ssl/record/ssl3_record.c:332

Posted

技术标签:

【中文标题】Node.js SSL 错误:错误的版本号:../deps/openssl/openssl/ssl/record/ssl3_record.c:332【英文标题】:Node.js SSL error: wrong version number: ../deps/openssl/openssl/ssl/record/ssl3_record.c:332 【发布时间】:2022-01-22 12:09:08 【问题描述】:

使用 Node.js 和交叉获取时,我在访问 HTTPS 站点时收到错误消息(请参阅下面的标题和 cmets)。不涉及代理。下面的代码是重现错误的简化版本。代码中的 cmets 包含准确的错误文本。

这一直有效,直到某些(?)发生变化,这让我相信服务器端的变化,我无法访问。但是,使用 GM_xmlhttpRequest 执行相同请求的 Tampermonkey JS 脚本仍然可以正常工作。

任何调试建议,或者为什么会生成“错误的版本号”?

编辑:在调试器中查看对tlssock.connect(options, tlssock._start); 的调用,'ciphers' 选项设置为ciphers: "TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA256:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!SRP:!CAMELLIA" ,'port' 选项为 443。在 TLSSocket 成员中,我没有看到任何跳出的东西在我与版本号有关。

const fetch = require('cross-fetch');
const testURL = 'https://api.torn.com/faction/?selections=upgrades&key=xxxxxxxxxx';

fetch(testURL).then(res => 
    console.log('[TEST] res: ', res);
).then(data => 
    console.log('[TEST] data: ', data);
).catch(err => 
    console.error("[TEST] error: ", err);
);

/*
Output:
[TEST] error:  FetchError: request to https://api.torn.com/faction/?selections=upgrades&key=xxxxxxxxxx failed, 
               reason: write EPROTO 140735681590144:
               error:1408F10B:SSL routines:ssl3_get_record:
               wrong version number:../deps/openssl/openssl/ssl/record/ssl3_record.c:332:

    at ClientRequest.<anonymous> (/Users/edlau/Documents/Torn-JS/Fac-chat-generic/node_modules/node-fetch/lib/index.js:1461:11)
    at ClientRequest.emit (events.js:400:28)
    at TLSSocket.socketErrorListener (_http_client.js:475:9)
    at TLSSocket.emit (events.js:400:28)
    at emitErrorNT (internal/streams/destroy.js:106:8)
    at emitErrorCloseNT (internal/streams/destroy.js:74:3)
    at processTicksAndRejections (internal/process/task_queues.js:82:21) 
  type: 'system',
  errno: 'EPROTO',
  code: 'EPROTO'
*/

编辑2:我将node.js更新到最新,结果相同,版本信息如下:

npm version

  facchat: '2.0.0',
  npm: '8.3.0',
  node: '17.3.0',
  v8: '9.6.180.15-node.12',
  uv: '1.42.0',
  zlib: '1.2.11',
  brotli: '1.0.9',
  ares: '1.18.1',
  modules: '102',
  nghttp2: '1.45.1',
  napi: '8',
  llhttp: '6.0.4',
  openssl: '3.0.1+quic',
  cldr: '40.0',
  icu: '70.1',
  tz: '2021a3',
  unicode: '14.0',
  ngtcp2: '0.1.0-DEV',
  nghttp3: '0.1.0-DEV'

编辑 3:使用 CURL(到相同的 URL): curl:(35)错误:140770FC:SSL例程:SSL23_GET_SERVER_HELLO:未知协议

【问题讨论】:

【参考方案1】:

在玩了几个小时后,将其简化为仅使用 curl 和各种选项,但都没有奏效 - 它终于再次奏效了。没有选择。我的测试代码现在也可以正常工作。所以我得出结论,这是服务器端“维护”正在进行,或者被路由到不同的服务器,服务器托管,据我所知,在 cloudflare 环境中。

因此,虽然我不能确定是什么造成了这种情况,但我无法再重现它。

【讨论】:

以上是关于Node.js SSL 错误:错误的版本号:../deps/openssl/openssl/ssl/record/ssl3_record.c:332的主要内容,如果未能解决你的问题,请参考以下文章

Node.js使用https请求时,出现“SSL23_GET_SERVER_HELLO”错误

卷曲错误:错误:1408F10B:SSL 例程:SSL3_GET_RECORD:错误的版本号

Python - SSL - 错误的版本号

错误:写入 EPROTO 4455222784:错误:1408F10B:SSL 例程:ssl3_get_record:错误的版本号:../deps/openssl/openssl/ssl/record

通过 SSL 使用 Socket.io Node.js 出现网关错误

为 SSL / TLS 配置 Proton 引发 openssl 错误版本号和 gRPC 客户端错误