是否可以使用 http 和 https 设置相同的端口工作?

Nul*_*ter 4 networking proxy apache2 nodejs

我有端口号是的 nodejs 应用程序,3001这个应用程序使用 http 但不适用于 https。在Apache服务器,用于设置翻领代理804435001和一套翻领代理的3001也。

http://<domain>:3001/socket.io/socket.js   ---> Work

https://<domain>:3001/socket.io/socket.js   ---> Not Work(Secure Connection Failed or This site can’t be reached)
Run Code Online (Sandbox Code Playgroud)

在这里,我需要知道相同的端口(3001)与http和一起使用https

有什么解决办法吗?

tho*_*ter 5

不,不可能在同一端口上运行 HTTP 和 HTTPS。

使用 HTTPS 时,连接从一开始就使用 SSL/TLS 协议。客户端不可能使用纯 HTTP 开始传输。

如果在端口上检测到纯文本通信,则 SSL/TLS 标准不提供回退到 HTTP 的方法。

  • 如果您编写 http(s) 服务器,您绝对可以做到这一点。很容易将 TLS 客户端握手“hello”与明文 HTTP 请求区分开来,您只需要检查第一个字节(== 0x16 (TLS) 与否)。但是,将它与大多数 HTTP 服务器实现结合起来是困难的或不可能的,因为它们通常不允许您将现有连接和缓冲区传递给它们。更重要的问题是您为什么要这样做,这通常不是一个好主意。 (4认同)
  • 不,不幸的是,您不能按照几条评论前的建议进行操作。在需要重定向端口的网络通信级别,您不知道是使用 HTTP 还是 HTTPS。虽然您可能能够缓冲和嗅探数据,但这既复杂又会影响安全性。 (2认同)

sve*_*nvg 2

我不知道他们是怎么做到的,但我公司的开发人员做了@thomasrutter说你不能做的事情:我们使用非标准TCP端口(所以不是80,也不是443),例如8080,并且在该端口上如果你发送一个 http 请求,它会将你重定向到同一端口 8080 上的 https。他们用 nginx 做到了这一点,但用 apache2 却没有实现这一点!

编辑:似乎确实在 nginx 中执行此操作,错误代码为 497,而您的浏览器则执行其余操作: https: //ma.ttias.be/force-redirect-http-https-custom-port-nginx/


kev*_*rpe 0

对的,这是可能的。2014 年,NodeJS GitHub 上提出了完全相同的问题(由 Zig 名人的 Andrew Kelley 提出):“能够在同一端口上同时提供 HTTP 和 HTTPS 服务” -> https://github.com/nodejs/node/问题/121

响应者推荐了这个非常简单(!)的 NodeJS 包: https: //github.com/mscdex/httpolyglot

粗略地说,它的工作原理是检查新连接的第一个字节。如果是不可打印的字符,则视为 SSL/TLS/HTTPS,否则视为 HTTP。非常令人印象深刻。更多详细信息请参见:https://github.com/mscdex/httpolyglot/issues/3