【问题标题】:node errors: SSL23_GET_SERVER_HELLO:unknown protocol and SSL3_GET_RECORD:wrong version number节点错误:SSL23_GET_SERVER_HELLO:未知协议和 SSL3_GET_RECORD:错误的版本号
【发布时间】:2014-11-22 13:05:30
【问题描述】:

好的,过去也有人问过同样的问题,但没有满意的答案;至少对我而言。长话短说,使用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:

如果在我的代码顶部我放了一个表格声明(来自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 仍然可以工作?如果是真的,你知道为什么吗,或者你能指出我理解问题的正确方向吗?

提前感谢您的帮助!

【问题讨论】:

    标签: node.js post https


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-01-11
      • 2013-03-03
      • 2014-02-03
      • 2019-03-12
      • 1970-01-01
      • 2015-11-29
      • 2012-10-05
      • 2021-12-12
      相关资源
      最近更新 更多