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



好吧,这个问题过去也被问过,但没有令人满意的答案;至少对我来说是这样。长话短说,使用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'
};

顺便说一句,我还检查了curl在传递参数--sslv3时工作良好。

然而,使用以上选项,我得到以下错误

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

如果我在我的代码上面放了一个形式声明(从这里开始的想法)

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的行为,在命令行中一切都在工作?

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

提前感谢您的帮助!

您应该有port: 443,,或者不设置它,因为443是使用https模块时的默认端口,而不是port: "80"

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

最新更新