是否可以在不使用Openssl的情况下在Node.js中创建https请求?

时间:2016-11-28 01:56:48

标签: node.js ssl

在项目过程中,我遇到了向(通常是较旧的)网站发送https请求的墙。虽然站点在浏览器中导航很好,但是当从Node发出请求时,它们会抛出502错误。更具体地说,他们声称SSL握手不好。但是cURL请求通过很好。

我认为我已经将问题缩小到在Node中使用OpenSSL。例如,SSL实验室对网站的分析告诉我,在握手模拟中:

  

OpenSSL 0.9.8y RSA 2048(SHA256)TLS 1.0 TLS_RSA_WITH_3DES_EDE_CBC_SHA

     

OpenSSL 1.0.1l R服务器已关闭连接

     

OpenSSL 1.0.2e R服务器已关闭连接

因此,在请求通过之前,与更高版本的OpenSSL的连接往往会被杀死。

现在,我认为,我可以将其煮熟,以便脚本只发出cURL请求,但我宁愿拥有一个没有任何额外依赖关系的解决方案。这里有可能的解决方案吗?

编辑:如果可能的话,我会对假设为什么后来的OpenSSL版本在所有其他类型的握手模拟成功时失败感兴趣。

我试图使用密码套件,但到目前为止它没有帮助。这是我的代码(4.6.2中的节点版本,如果重要的话):

var https = require('https');

var options = {
  hostname: 'thewebsite.net',
  port: 443,
  agent: false,
  servername: 'thewebsite.net',
  path: '/',
  ciphers: 'ALL',
  method: 'GET'
};

https.request(options, (res) => {
  console.log(res);
});

我使用过secureProtocol,agent和serverName选项,但到目前为止似乎没有任何效果。根据使用的选项,我收到引用SSL握手问题的502错误,或者:

Caught exception: Error: socket hang up
at TLSSocket.onHangUp (_tls_wrap.js:1054:19)
at TLSSocket.g (events.js:260:16)
at emitNone (events.js:72:20)
at TLSSocket.emit (events.js:166:7)
at endReadableNT (_stream_readable.js:923:12)
at nextTickCallbackWith2Args (node.js:458:9)
at process._tickDomainCallback (node.js:413:17)

1 个答案:

答案 0 :(得分:0)

您可以通过设置ciphers选项手动指定要用于请求的密码。 ciphers列表的格式遵循the OpenSSL cipher list format

FWIW当前节点使用的default cipher list(从节点v7.2.0开始)是(减去换行符):

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