使用https模块进行POST时,Node.js v8.11.1出现EPROTO错误

6
我有一个运行在AWS上的Node 8.11.1系统。有一个函数负责将日志写入到另一台服务器中,该函数需要记录请求对象。
问题出在实际POST尝试时,我遇到了以下错误: "Error: write EPROTO 139746875082624:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:../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 的值是多少? - Aravind Voggu
@AravindVoggu 很好的问题。LOG_DOMAIN和LOG_PORT是传递给函数的变量。我已经更新了原始帖子以反映这一点。 - JSBach
是的,我正在寻找“值” :)。httpS使用端口443,而http仅使用端口80。如果LOG_PORT值为80并且您尝试使用httpS,则可能会收到类似以下错误的错误。您可以检查并确认LOG_PORT是否设置为443吗?在此期间,也请发布LOG_DOMAIN的值,以确保。 - Aravind Voggu
@AravindVoggu 我正在将日志发布到一个ELK服务器,并且我正在使用除443以外的端口。出于我的组织安全方面的考虑,我不愿公开实际域名。 话虽如此,除了443端口,我是否无法在其他端口上安全地发布?该域名需要另一个端口,但我不知道Node模块是否仅限于该端口。 - JSBach
1
我会与我们的平台团队核实是否有相关日志记录。@AravindVoggu,非常感谢您的时间! - JSBach
显示剩余2条评论
2个回答

5
经过进一步研究,看起来Aravind Voggu(参见评论)是正确的:错误来自于尝试使用HTTPS连接仅允许HTTP的服务器。
当尝试保护未安全连接的内容时,OpenSSL失败了。
使我的代码正常工作所需的唯一更改是在使用位置中删除“https”中的“s”。
const http = require("http");

0

如果服务器端的SSL证书过期,就可能会遇到这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接