节点错误:SSL23_GET_SERVER_HELLO:未知协议和SSL3_GET_RECORD:版本号错误

时间:2014-09-27 18:35:31

标签: node.js post https

好的,过去曾经问过同样的问题,但没有令人满意的答案;至少对我而言。简而言之,使用curl将数据发布到远程(注意:https)服务器,其中包含以下工作:

curl -X POST 'https://a.b.c.d/somewhere/' --data 'somedata' --header "Content-Type: text/turtle" -i

现在,是时候使用node做同样的事了。我的功能很好,如果不使用https模块,我使用http模块,我收到一条消息,我必须再次尝试https。所以,我使用https来发出请求,使用以下选项:

var myOptions = {
    hostname : "a.b.c.d",
    port     : "80",
    path     : "/somewhere/",
    method   : 'POST',
    headers  : {
        'Content-Type'   : 'text/turtle', 
        'Content-Length' : message.length
        },
    secureProtocol : 'SSLv3_method'
};

顺便说一下,在传递参数--sslv3时,我还检查了curl的工作正常。

但是,使用上述选项我会收到以下错误

140735237133072:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:../deps/openssl/openssl/ssl/s23_clnt.c:787:

如果在我的代码之上我放了一个表单声明(来自here的想法)

https.globalAgent.options.secureProtocol = 'SSLv3_method';

然后实际上错误消息变为

140735237133072:error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number:../deps/openssl/openssl/ssl/s3_pkt.c:338:

我发现这是意料之外的,因为我已在选项部分中指出我希望将SSLv3_method用作协议。在任何情况下,我如何能够从命令行重现curl的行为?

最后,here提到端口80可能是与https一起使用它的错误端口。这是真的吗?为什么curl无论如何都会工作?如果是真的,你知道为什么,或者你能指出我正确的方向来理解这个问题吗?

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:4)

你应该port: 443,或者只是保留它,因为443是使用https模块时的默认端口,而不是port: "80"

cURL在没有端口的情况下工作,因为它知道默认情况下https://是端口443。您可以将网址作为第一个参数(例如cURL)传递给https.request(),但是您无法自定义methodheaders或其他任何无法仅通过网址确定的内容。