使用node.js进行https post请求时出现错误"ssl3_get_record:wrong version number"

18

我正在尝试使用以下脚本通过node.js向我的工作api发出https请求

const https = require('https');
const options = {
    hostname,
    path: fullPath,
    port: 80,
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
        'Content-Length': data.length
    }
};
const req = https.request(options, (res) => {
    console.log('statusCode:', res.statusCode);
    res.on('data', chunk => console.log('chunk:', chunk));
});
req.on('error', error => {
    console.log('Failed!');
    console.log(error);
});
req.write(data);
req.end();

而我所得到的回应是

Failed!
Error: write EPROTO 6772:error:1408F10B:SSL routines:ssl3_get_record:wrong version number:c:\ws\deps\openssl\openssl\ssl\record\ssl3_record.c:332:

    at WriteWrap.onWriteComplete [as oncomplete] (internal/stream_base_commons.js:87:16) {
  errno: 'EPROTO',
  code: 'EPROTO',
  syscall: 'write'
}

我在浏览器上使用jQuery发出了这个请求,它起作用了


$.post({
    url, data,
    success: res => console.log(res),
});

我尝试使用头部X-SSL-PROTOCOL,但没有成功。由于它们是机密的,所以URL和数据已被隐藏,但在jQuery示例和node.js中它们是相同的。

1个回答

30
    port: 80,
    method: 'POST',
    ...
const req = https.request(options, (res) => {
您正在使用HTTPS访问80端口,而80端口通常是明文HTTP。您获得的响应表明服务器未在此端口提供HTTPS,这实际上是预期的行为。 HTTPS通常在443端口上完成。
我在使用jQuery浏览器发出了此请求,并且它成功了。
在此示例中,不清楚url是什么,但如果它只是https://domain/path,那么端口443已经被使用。只有在显式给出的情况下,即https://domain:80/path,才会使用端口80进行HTTPS。

2
将端口更改为443成功了!非常感谢。 - Giovani Rubim
当我将网站从http迁移到https时,我忘记同时更改端口为443 - Jack Wang

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