节点请求-获取错误“ SSL23_GET_SERVER_HELLO:未知协议”


72

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

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。

任何帮助表示赞赏。


当您在几秒钟后重试相同的网址时会发生什么?
generalhenry 2013年

1
几秒钟后,我没有收到任何错误消息。有时仅返回错误。
umutm

Answers:


112

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


刚刚遇到了docker这个问题,就在我的docker-compose中:端口:-“ 443:80”
IAmJulianAcosta 2016年

17

这完全是我的坏事。

我在代码的一部分上使用了标准节点http.request,该代码应该仅将请求发送到http地址。好像数据库有一个https地址,该地址以随机间隔查询。

简而言之,我试图将HTTP请求发送到https。


6
该错误看起来更像是将https请求发送到http端口?
Michael Krelin-黑客

2
该错误消息清楚地表明您正在使用HTTPS(即SSL),并且服务器也向您发送了“未知协议”消息,也使用SSL。您不会对数据库说HTTP或HTTPS。答案没有道理。
user207421 '16

6

我收到此错误的原因是我正在使用本require('https')应使用的位置require('http')


4

一些站点使用SSLv2,或者至少发送SSLv2服务器问候,而您的客户端不使用SSLv2,或者没有将其配置为使用SSLv2。您需要在此处做出政策决定。SSLv2应该早在几年前就已经消失了,而且仍在使用它的站点是不安全的。但是,如果您要与他们交谈,则只需在可能时启用它即可。如果可以的话,我会向网站所有者投​​诉。


尽管错误听起来像这样,但不确定是否考虑相同的URL有时会返回此错误。顺便说一句,在节点请求中,是否有一种方法可以同时启用SSLv2和SSLv3?还是应该在Windows OS级别上执行此操作?
umutm

如果该站点是一个服务器场,并且在不同元素中具有不同的SSL级别,则可能会发生这种情况:这将是一个疯狂的设置,但是如果完全有SSLv2,则它已经是疯狂的了。我不能为您提供有关node.js的建议,但是显然它是在后台使用OpenSSL,并且OpenSSL是高度可配置的。不过,我会先调查有问题的网站,您不想在没有充分理由的情况下最终启用SSLv2。
user207421

1
仍然无法准确找出问题所在。完成后,我将更新此条目。
umutm

1
@umutm 4年了,这仍然是一个问题。得到同样的错误。
Dojo

@Dojo从Node v4 +开始,我建议使用Node的默认值(SSLv23_method),因为它在我的经验中具有最大的兼容性。另外,Node.js中没有SSLv3支持,因此,如果所请求的网站希望使用SSLv3,则可能是问题所在。
umutm '17

4

我遇到了这个问题(每个软件包403错误),但我发现互联网上没有什么好解决的办法。 我的.npmrc我的用户文件夹内的文件是错误和误解。 我从改变了这npmrc行

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

至 :

proxy = XX.XX.XXX.XXX:XXXX

非常感谢!我快疯了。这也是.net核心的问题(Linux)(但可在Java中使用):export http_proxy = xxxx:8888 export https_proxy = xxxx:8888
dtroy

2
var https = require('https');
https.globalAgent.options.secureProtocol = 'SSLv3_method';

1
并没有解决我的问题,但是有用的信息
keinabel

1
SSLv3既危险又过时……而是使用secureProtocol:“ TLSv1_method”
Scott Stensland

0

连接到Amazon RDS时出现此错误。当它是开发服务器时,我检查了服务器状态CPU使用率的50%,没有人使用它。

它以前一直在工作,并且连接配置中的任何内容都没有更改。重新启动服务器为我解决了这个问题。


0

简而言之,

vi ~/.proxy_info

export http_proxy=<username>:<password>@<proxy>:8080
export https_proxy=<username>:<password>@<proxy>:8080

source ~/.proxy_info

希望这可以帮助某人赶时间:)


这不能解释为什么该建议可以解决问题。
Richlv

0

就我而言(网站SSL使用ev曲线),通过添加此选项ecdhCurve解决了SSL问题:'P-521:P-384:P-256'

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

JFYI,也许这会帮助某人


0

我遇到了这个错误,同时在我的火箭聊天中使用它通过企业代理与gitlab通信,

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.