Node.js 10 HTTPS 服务器拒绝连接
Posted
技术标签:
【中文标题】Node.js 10 HTTPS 服务器拒绝连接【英文标题】:Node.js 10 HTTPS server is rejecting connections 【发布时间】:2019-02-04 02:33:01 【问题描述】:我有简单的 Node.js HTTPS 服务器
const https = require('https');
const fs = require('fs');
const config =
key: fs.readFileSync('cert/server-key.pem'),
cert: fs.readFileSync('cert/server-crt.pem'),
ca: fs.readFileSync('cert/ca-crt.pem'),
;
const server = https.createServer(config, ((req, res) =>
console.log('Got request');
res.end();
));
server.listen(3333);
我在嵌入式系统上使用curl
。
# curl -V
curl 7.52.1 (arm-unknown-linux-gnu) libcurl/7.52.1 wolfSSL/3.9.8
Protocols: file ftp ftps http https smtp smtps telnet tftp
Features: IPv6 Largefile SSL UnixSockets
当我使用版本 10 以外的 Node.js 时 - 一切正常。
在 Node.js v8.2.1
上运行的 HTTPS 服务器# curl -k -v "https://10.43.11.128:3333/"
* Trying 10.43.11.128...
* TCP_NODELAY set
* Connected to 10.43.11.128 (10.43.11.128) port 3333 (#0)
* SSL connected
> GET / HTTP/1.1
> Host: 10.43.11.128:3333
> User-Agent: curl/7.52.1
> Accept: */*
在 Node.js v10.1.0
上运行的 HTTPS 服务器# curl -k -v "https://10.43.11.128:3333/"
* Trying 10.43.11.128...
* TCP_NODELAY set
* Connected to 10.43.11.128 (10.43.11.128) port 3333 (#0)
* SSL_connect failed with error -313: revcd alert fatal error
* Curl_http_done: called premature == 1
* Closing connection 0
curl: (35) SSL_connect failed with error -313: revcd alert fatal error
Node.js 10 在 HTTPS 方面发生了哪些变化?我怀疑我必须更改 SSL 设置,但我确定如何更改。
更新:
尝试访问 HTTP (Node.js v10.1.0)
# curl --insecure -v "10.43.11.128:3333/"
* Trying 10.43.11.128...
* TCP_NODELAY set
* Connected to 10.43.11.128 (10.43.11.128) port 3333 (#0)
> GET / HTTP/1.1
> Host: 10.43.11.128:3333
> User-Agent: curl/7.52.1
> Accept: */*
>
* Curl_http_done: called premature == 0
* Empty reply from server
* Connection #0 to host 10.43.11.128 left intact
curl: (52) Empty reply from server
Wireshark 捕获pcap file。
【问题讨论】:
你试过Node.js v10.9.0
吗?
@ArifKhan 是和没有区别
很可能您的 TLS 库太旧,并且其中存在一些(现在希望已修复)错误导致此问题。 wolfSSL 版本 3.9.8 于 2016 年发布。尝试将 curl 更新为 2018 版本的 woflSSL,例如 3.15.3
@hanshenrik 谢谢,那将是理想的,但这是不可能的 - 设备有旧的固件和只读文件系统......即使我升级我仍然想让节点服务器与旧的一起工作设备。
@m1ch4ls 尝试使用旧的 2015-2016 版本的 NodeJS,例如 nodejs.org/download/release/v4.2.4,curl 可以与之通信吗?
【参考方案1】:
问题是客户端没有广播对服务器需要的密码套件或扩展的支持。
此问题的一些常见解决方案可能是: - 如果使用 ECC,服务器需要启用 Supported Curves Extension。用“--enable-supported curve”编译wolfSSL来解决。 - 为安全起见,wolfSSL 默认禁用静态密钥密码套件。如果您的服务器需要,请参阅自述文件顶部的说明,了解有关重新启用静态密钥密码套件的说明。
Here is the Thread which discuses the error which you have received 。希望这能解决您的问题
【讨论】:
感谢您的指点...不幸的是,重新编译不是一种选择。我无法替换系统的curl
。我必须以某种方式调整 Node.js SSL/TLS 设置来支持旧客户端。安全性不是问题,因为这仅用于开发和测试。
您的回答并没有解决我的问题,但到目前为止已经给了我线索,希望能帮助我自己解决它。谢谢。【参考方案2】:
验证 curl 发送哪些标头,您可以使用 -v 参数。
curl -vIX "https://10.43.11.128:3333/"
还有 在节点中,
只需在 req.end() 之后使用 console.log(req._headers) 并比较您的标头以进一步解决问题。我还请求尝试使用 wireshark (http://www.wireshark.org/) 进行 ssl 连接测试。
因为它是由 --insecure 工作的,但你需要知道原因。
--不安全
(SSL) 此选项明确允许 curl 执行“不安全” SSL 连接和传输。尝试所有 SSL 连接 使用安装的 CA 证书包确保安全 默认。这使得所有连接都被认为是“不安全的” 除非使用 -k, --insecure 否则失败。你也可以试试这个
const https = require("https"),
fs = require("fs");
const options =
key: fs.readFileSync("/cert/server-key.pem"),
cert: fs.readFileSync("/cert/server-cert.pem")
;
const app = express();
app.use((req, res) =>
res.writeHead(200);
res.end("hello world\n");
);
app.listen(8000);
https.createServer(options, app).listen(8080);
【讨论】:
curl -k -vIX HEAD "https://10.43.11.128:3333"
给出与问题相同的结果...请求永远不会到达节点服务器。
一个选项,请您尝试删除 -k 并仅运行 ---------->curl -vIX "10.43.11.128:3333"
什么都不做:# curl -vIX "10.43.11.128:3333/" curl:没有指定 URL! curl:尝试“curl --help”以获取更多信息
你也可以试试这个 curl --insecure -v "10.43.11.128:3333/"
答案已更新,curl
输出命中 HTTP 和 Wireshark 捕获文件。以上是关于Node.js 10 HTTPS 服务器拒绝连接的主要内容,如果未能解决你的问题,请参考以下文章
AWS 部署 NGINX 连接被拒绝用于 Node.JS 项目
通过套接字连接将 https 代理请求传递到命名管道(node.js)