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

74
我正在使用node-request模块,定期向一组URL发送GET请求,并且有时会在某些站点上遇到以下错误:

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。

如果您能提供任何帮助将不胜感激。


几秒钟后重试相同的URL会发生什么? - generalhenry
1
几秒钟后,我没有收到任何错误。有时候只会返回错误。 - umutm
10个回答

115

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


刚刚在使用Docker时遇到了这个问题,我的docker-compose文件中有以下内容:ports: - "443:80" - IAmJulianAcosta

18

这完全是我的错。

我在代码的某个部分使用了标准的node http.request方法,但实际上这部分代码只应该向http地址发送请求。看起来数据库中有一个https地址,且该地址被随机轮询查询。

简单来说,我试图向https发送http请求。


6
这个错误看起来更像是发送了HTTPS请求到HTTP端口? - Michael Krelin - hacker
2
错误信息清楚地显示您正在使用HTTPS,即SSL,并且服务器向您发送了一个“未知协议”消息,同样是在SSL中。您不会将HTTP或HTTPS用于数据库。答案毫无意义。 - user207421

7

我遇到了这个错误是因为我使用了 require('https'),但我应该使用 require('http')


4

我遇到了这个问题(每个软件包都出现403错误),但在互联网上找不到解决方法。 我的用户文件夹中的.npmrc文件是错误的并被误解了。 我更改了这个npmrc行:

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

致:

proxy = XX.XX.XXX.XXX:XXXX

非常感谢!我都快疯了。这就是问题所在:.net core也有问题(在Linux上),但Java可以正常工作: export http_proxy=http://x.x.x.x:8888 export https_proxy=https://x.x.x.x:8888 - dtroy

4

一些网站正在使用SSLv2,或至少发送了一个SSLv2的服务器hello,而你的客户端不能支持,或者没有配置支持SSLv2。在这里,你需要做出一个政策决策。SSLv2应该已经在数年前从地球上消失了,仍然使用它的网站是不安全的。然而,如果你必须与他们交流,你只需要在你的端口启用它,如果你可以的话。如果可以的话,我建议向网站所有者投诉。


尽管错误提示是这样的,但考虑到同样的 URL 有时会返回此错误,我们不能确定是否如此。另外,在node-request中,有没有一种方法可以同时启用SSLv2和SSLv3?还是我应该在Windows操作系统层面上进行设置? - umutm
如果该站点是一个农场,并且不同的元素具有不同的SSL级别,那么这种情况可能会发生:这将是一个疯狂的设置,但如果存在任何SSLv2,则已经很疯狂了。我无法就node.js向您提供建议,但它显然在幕后使用OpenSSL,并且OpenSSL高度可配置。不过,我建议先调查相关站点,因为您不希望在没有充分理由的情况下启用SSLv2。 - user207421
1
仍然无法准确确定问题所在。一旦完成,我将更新此条目。 - umutm
1
@umutm 四年过去了,这个问题仍然存在。我也遇到了同样的错误。 - Dojo
@Dojo 从 Node v4+ 开始,我建议使用 Node 的默认 (SSLv23_method) 作为它在我的经验中具有最大的兼容性。此外,Nodejs 中已经删除了对 SSLv3 的支持,所以如果请求的网站需要 SSLv3,则可能会出现问题。 - umutm

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

1
没有解决我的问题,但是提供了有用的信息。 - keinabel
1
SSLv3 是危险且过时的... 相反,请使用 secureProtocol: "TLSv1_method" 来确保安全。 - Scott Stensland

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: 'P-521:P-384:P-256',SSL 问题得到了解决。
request({ url, 
   agentOptions: { ecdhCurve: 'P-521:P-384:P-256', }
}, (err,res,body) => {
...

顺便提一下,也许这会对某些人有所帮助


0

我在连接Amazon RDS时遇到了这个错误。我检查了服务器状态,发现CPU使用率达到了50%,但它是一个开发服务器,没有人在使用。

之前一直可以正常工作,而且连接配置中也没有做任何更改。重启服务器后问题得到了解决。


0

我在使用rocketchat通过企业代理与我的gitlab通信时遇到了这个错误,

因为我使用的是https://:8080,但实际上应该使用http://:8080。


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