允许node.js HTTPS请求的所有SSL协议

时间:2017-09-06 06:08:54

标签: node.js ssl curl openssl

是否可以使node.js https.request(客户端)与远程服务器协商任何可能的协议(即使是不安全的)?我理解安全风险,但对于我的项目,一些网站只使用旧的/不安全的SSL协议和密码。

例如:https://www.dot.ny.govcurl或Ubuntu Server 16.04上的最新node.js 7.10.1默认配置不起作用(超时)。它仅适用于使用curl--tlsv1.0选项的--sslv3

有没有办法让node.js使用一系列协议(从最安全到最不安全)重新协商SSL连接,或者使用尽可能广泛的配置(通过node.js或底层OpenSSL)来启用所有协议SSL协议&密码?

2 个答案:

答案 0 :(得分:3)

仅允许这些协议无法解决您使用该网站描述的问题。 TLS在设计上大部分是向后兼容的,即只能执行SSL 3.0或TLS 1.0的正确实现的服务器只会回答支持最佳协议,如果遇到来自支持TLS 1.2的客户端的ClientHello。这是因为客户端只是宣布它可以的最佳版本,然后服务器选择它支持的最佳版本,该版本等于或小于客户端提供的版本。只有这样,"允许"到位,即如果客户端将接受具有较低版本的服务器的回复。

但这不是您展示的网站的问题。在这种情况下,服务器或它前面的一些中间件有一个错误的SSL / TLS堆栈,它只是在意外的ClientHello上呱呱叫。这些可能是ClientHello,它具有意外的TLS版本,意外的扩展,意外的密码,这些密码太小或太大或类似的特性。

在这种特定情况下,TLS协议版本似乎根本不是问题,但它看起来更像是ClientHello的大小是一个问题可能是因为前面有一个带有this bug的旧F5负载均衡器它的。由于浏览器往往只提供一些密码,因此ClientHello的大小时间足够小,不会受到此问题的影响。例如,如果您尝试使用openssl s_client -connect www.dot.ny.gov:443 -cipher 'AES128-SHA'中的简化密码集,即使使用TLS 1.2 ClientHello也会成功,但如果您尝试使用较大的密码(例如-cipher 'AES'),它将会挂起而不会得到回复,可能是因为破碎的负载均衡器在大型ClientHello上嘶哑。通过在命令行中强制执行TLS 1.0,您只需确保它不提供新的TLS 1.2密码,这也会减小ClientHello的大小。

通过仅允许所有内容来处理这些损坏的服务器没有通用的方法,因为"允许"只有在服务器回复之后(在这种情况下它不会)并且一些实际上可能会导致服务器出现更多问题(例如提供过多的密码会增加ClientHello的大小)。相反,必须调试问题,找出损坏的服务器喜欢什么和它讨厌什么,然后设计一个特定的TLS握手(版本,密码,扩展,大小......),以便服务器喜欢它。了解特定服务器接受的内容的一个好方法是查看analysis by SSLLabs

答案 1 :(得分:0)

用于发出HTTP(S)请求的最流行的NPM包之一是request。 根据其文档,您可以指定要接受的SSL协议。

如果您提前知道您要访问的网站以及他们使用的协议,您可以根据请求进行设置。否则我想你可以编写一些条件,尽管提出多个请求的开销会很麻烦。