2014-09-27 114 views
0

好吧,这个问题在过去一直被问到,但没有令人满意的答案;至少为了我的目的。长话短说,使用curl张贴数据到远程(注:https)服务器有以下工作:节点错误:SSL23_GET_SERVER_HELLO:未知协议和SSL3_GET_RECORD:错误版本号

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

现在,时间一到就做使用节点同样的事情。我的功能正常工作,如果不使用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时工作正常。

然而,通过上述方式,我得到以下错误

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: 

我发现这个意外,因为我有alr eady在选项部分中指出我想要SSLv3_method用作协议。无论如何,我将如何从命令行重现curl的行为,其中一切正常?

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

在此先感谢您的帮助!

回答

4

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

cURL没有端口,因为它知道默认情况下https://是端口443。你可以可以作为第一个参数(如cURL)传递一个url到https.request(),但是你不能自定义methodheaders,或者其他任何不能单独由URL确定的东西。

+0

谢谢。像魅力一样工作。 :-) 祝你有美好的一天! – MightyMouse 2014-09-27 23:53:23

相关问题