发出 https 发布请求时,node.js 中出现错误“ssl3_get_record:wrong version number”

Gio*_*bim 7 ssl https post node.js

我正在尝试通过以下脚本使用 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();
Run Code Online (Sandbox Code Playgroud)

作为回应,我得到

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'
}
Run Code Online (Sandbox Code Playgroud)

我使用 jQuery 在浏览器上提出了这个请求,它工作正常

$.post({
    url, data,
    success: res => console.log(res),
});
Run Code Online (Sandbox Code Playgroud)

我尝试使用标头 X-SSL-PROTOCOL 没有成功。url 和 data 是隐藏的,因为它们是机密的,但它们在 jQuery 示例和 node.js 中是相同的。

Ste*_*ich 15

    port: 80,
    method: 'POST',
    ...
const req = https.request(options, (res) => {
Run Code Online (Sandbox Code Playgroud)

您正在对端口 80 使用 HTTPS,这通常是普通的 HTTP。您得到的响应表明服务器没有在此端口上提供 HTTPS,这实际上是预期的行为。HTTPS 通常在端口 443 上完成。

我使用 jQuery 在浏览器上提出了这个请求,它工作正常

目前尚不清楚url此示例中的内容,但如果只是,https://domain/path则使用端口 443。如果明确给出,则端口 80 只会与 HTTPS 一起使用,即https://domain:80/path.

  • 将端口更改为 443 成功了!非常感谢 (2认同)