【问题标题】:Node.js v8.11.1 EPROTO error when attempting to POST using https module尝试使用 https 模块进行 POST 时出现 Node.js v8.11.1 EPROTO 错误
【发布时间】:2019-04-19 22:29:54
【问题描述】:

我有一个在 AWS 上的节点 8.11.1 上运行的系统。有一个功能可以将日志写入另一台服务器。此函数接受它记录的请求对象。

我的问题在实际 POST 尝试期间出现,给我以下错误:

错误:写入 EPROTO 139746875082624:错误:140770FC:SSL 例程:SSL23_GET_SERVER_HELLO:未知协议:../deps/openssl/openssl/ssl/s23_clnt.c:827:

我看不出我的代码有什么问题。
为什么会发生错误,我能做些什么来解决它?

这是函数内部的代码:

const https = require('https');    
try
{
   const postData = "New log finished " + JSON.stringify(request, null, 2);

   const options =
   {
      hostname: LOG_DOMAIN,
      port: LOG_PORT,
      path: '/',
      method: 'POST'
   };

   const req = https.request(options);
   req.on('error', (e) =>
   {
      console.error("ERROR writing logs: " + e);
   });
   req.write(postData);
   req.end();
}
catch (e)
{
   console.log(e);
}

LOG_DOMAIN 和 LOG_PORT 是传递给函数的变量。

【问题讨论】:

  • LOG_PORT 的值是多少?
  • @AravindVoggu 很好的问题。 LOG_DOMAIN 和 LOG_PORT 是传递给函数的变量。我已经更新了原始帖子以反映这一点。
  • 是的,我正在寻找“价值”:)。 httpS 使用 443 端口,http 只使用 80 端口。如果 LOG_PORT 值为 80,而您尝试使用 httpS,则会收到类似这样的错误。您可以检查并确认 LOG_PORT 设置为 443 吗?同时发布 LOG_DOMAIN 的值,以防万一。
  • @AravindVoggu 我正在发布到保存日志的 ELK 服务器,并且我使用的端口不是 443。为了我的组织的安全目的,我不愿发布实际域。也就是说,我是否无法在 443 以外的端口上安全发布?域需要另一个端口,但我不知道 Node 模块是否仅限于该端口。
  • 我会与我们的平台团队核实,看看是否有任何相关日志。 @AravindVoggu 非常感谢您的宝贵时间!

标签: node.js post https


【解决方案1】:

经过进一步研究,Aravind Voggu(参见 cmets)似乎是正确的:错误来自尝试将 HTTPS 用于仅允许 HTTP 的服务器。

在尝试保护与不安全对象的连接时,OpenSSL 会死机。

使我的代码正常工作所需的唯一更改是从所用位置的“https”中删除“s”。

const http = require("http");

【讨论】:

    【解决方案2】:

    如果服务器端 ssl 证书过期,可能会遇到此问题

    【讨论】:

      猜你喜欢
      • 2015-08-02
      • 2015-09-26
      • 2013-02-23
      • 1970-01-01
      • 1970-01-01
      • 2016-03-22
      • 1970-01-01
      • 1970-01-01
      • 2013-07-26
      相关资源
      最近更新 更多