【问题标题】:node-request - Getting error "SSL23_GET_SERVER_HELLO:unknown protocol"节点请求 - 收到错误“SSL23_GET_SERVER_HELLO:未知协议”
【发布时间】:2013-03-03 11:56:03
【问题描述】:

我正在使用node-request 模块,定期向一组 URL 发送 GET 请求,有时在某些网站上会出现以下错误。

Error: 29472:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:openssl\ssl\s23_clnt.c:683

问题是我不会总是或总是在某些 URL 上收到此错误,只是有时。另外,不能用“strictSSL: false”忽略。

我读到这可能与我使用错误的协议(SSLv2、SSLv3、TLS..)发送 SSL 请求有关。但这并不能解释为什么它会不规律地发生。

顺便说一句,我在 Win 2008 服务器上运行 nodejs。

感谢任何帮助。

【问题讨论】:

  • 几秒后重试相同的网址会发生什么?
  • 几秒钟后,我没有收到任何错误。有时只会返回错误。

标签: javascript node.js ssl request


【解决方案1】:

当您通过错误的端口(例如 80)请求 HTTPS 资源时,您将收到此类错误消息。因此请确保在请求选项中指定正确的端口,443。

【讨论】:

  • 刚遇到 docker 的这个问题,在我的 docker-compose 中有:ports: - "443:80"
【解决方案2】:

这完全是我的错。

我在代码的一部分上使用了标准节点 http.request,它应该只向 http 地址发送请求。似乎数据库有一个单独的 https 地址,该地址以随机间隔进行查询。

简单地说,我试图向 https 发送一个 http 请求。

【讨论】:

  • 这个错误看起来更像是向 http 端口发送 https 请求?
  • 错误消息清楚地表明您使用的是 HTTPS,即 SSL,并且服务器向您发送了一条“未知协议”消息,也是在 SSL 中。您不会对数据库使用 HTTP 或 HTTPS。答案没有意义。
【解决方案3】:

我收到此错误是因为我使用了 require('https'),而我应该使用 require('http')

【讨论】:

    【解决方案4】:

    一些网站使用 SSLv2,或者至少发送 SSLv2 服务器问候,而您的客户端不使用或未配置为使用 SSLv2。您需要在此处做出政策决定。 SSLv2 早在几年前就应该从地球上消失了,仍然使用它的网站是不安全的。但是,如果您必须与他们交谈,您只需在最后启用它,如果可以的话。如果可以的话,我会向网站所有者投​​诉。

    【讨论】:

    • 虽然错误听起来像这样,但不确定是否是这种情况,考虑到相同的 URL 有时会返回 thiş 错误。顺便说一句,在节点请求中,有没有办法同时启用 SSLv2 和 SSLv3?或者,我应该在 Windows 操作系统级别上执行此操作吗?
    • 如果站点是一个农场并且不同元素中有不同的 SSL 级别,则可能会发生这种情况:这将是一个疯狂的设置,但如果有 SSLv2 就已经很疯狂了。关于 node.js,我无法为您提供建议,但它显然在后台使用 OpenSSL,而且 OpenSSL 是高度可配置的。不过,我会先调查有问题的网站,您不希望在没有充分理由的情况下最终启用 SSLv2。
    • 仍然无法准确识别问题。完成后,我将更新此条目。
    • @umutm 4 年过去了,这仍然是一个问题。得到同样的错误。
    • @Dojo 从 Node v4+ 开始,我建议使用 Node 的默认值 (SSLv23_method),因为它在我的经验中具有最大的兼容性。此外,Nodejs 中不再支持 SSLv3,因此,如果所请求的网站需要 SSLv3,则可能是问题所在。
    【解决方案5】:

    我遇到了这个问题(每个包都有 403 错误),我在互联网上没有找到很好的解决方法。 我的用户文件夹中的.npmrc 文件错误且被误解。 我将这条 npmrc 行从

    proxy=http://XX.XX.XXX.XXX:XXX/
    

    到:

    proxy = XX.XX.XXX.XXX:XXXX
    

    【讨论】:

    • 非常感谢!我快疯了。这也是.net核心的问题(linux)(但在java中工作):export http_proxy=x.x.x.x:8888 export https_proxy=x.x.x.x:8888
    【解决方案6】:
    var https = require('https');
    https.globalAgent.options.secureProtocol = 'SSLv3_method';
    

    【讨论】:

    • 没有解决我的问题,但是有用的信息
    • SSLv3 很危险且已过时...改为使用 secureProtocol: "TLSv1_method"
    【解决方案7】:

    我在连接到 Amazon RDS 时收到此错误。我检查了服务器状态 50% 的 CPU 使用率,而它是一个开发服务器并且没有人使用它。

    它以前可以工作,连接配置中没有任何变化。 重新启动服务器为我解决了这个问题。

    【讨论】:

      【解决方案8】:

      总之,

      vi ~/.proxy_info
      
      export http_proxy=<username>:<password>@<proxy>:8080
      export https_proxy=<username>:<password>@<proxy>:8080
      
      source ~/.proxy_info
      

      希望这对匆忙的人有帮助:)

      【讨论】:

      • 这并不能解释为什么该建议可以解决问题。
      【解决方案9】:

      在我的情况下(网站 SSL 使用 ev 曲线)通过添加此选项解决了 SSL 问题 ecdhCurve: 'P-521:P-384:P-256'

      request({ url, 
         agentOptions: { ecdhCurve: 'P-521:P-384:P-256', }
      }, (err,res,body) => {
      ...
      

      JFYI,也许这会对某人有所帮助

      【讨论】:

        【解决方案10】:

        我在 Rocketchat 上使用它通过企业代理与我的 gitlab 通信时遇到此错误,

        因为,使用的是 https://:8080 但实际上,它适用于 http://:8080

        【讨论】:

          猜你喜欢
          • 2014-11-22
          • 2016-01-11
          • 2023-03-31
          • 2014-02-03
          • 2019-03-12
          • 1970-01-01
          • 1970-01-01
          • 2015-11-29
          相关资源
          最近更新 更多