我已在 TCP 端口 91 上托管我的网站。
有没有办法将他们的 SSL 证书绑定在同一个端口 91 上?
答案1
我在 TCP 端口 91 上托管了我的网站。有没有办法将他们的 SSL 证书绑定在同一个端口 91 上?
我将这个问题解释为“我正在运行我的网站http://www.mysite.example:91/
,并且我还想在https://www.mysite.example:91/
”(在这种情况下,它不是重复的同一 IP 地址和同一端口上有多个 SSL 域吗?,暂时标记)。
这可以使用港口统一例如,Grizzly(Java Web 服务器)支持该功能。(您的问题并未说明您想使用哪个服务器。)
端口统一可以适用于任何需要客户端首先通信的协议(例如 HTTP、SSL/TLS,但不是 IMAP,...)。
本质上,服务器在发送请求之前会尝试通过查看请求的开头来检测所使用的协议。如果收到,GET / ...
则可以假定这是 HTTP 请求。如果收到ClientHello
,则可以假定这是一个 SSL/TLS 请求(在这种情况下,如果需要,可以将其重定向到其顶部的适当协议基于 TLS 的 HTTP)。
支持此功能的情况并不常见,但确实有效。不过,如果端口不是默认端口,则必须在 URL 中明确指定端口(80 始终是 的默认端口http://
,443 始终是 的默认端口https://
)。
我不知道 Apache Httpd 中是否实现了此功能,但原则上这不是问题。其他答案提到两个服务(或两个进程)不能侦听同一个端口。这是真的,但没有什么可以阻止同一个服务器/进程处理多个站点(当同一个进程侦听多个端口(例如 80 和 443)并VirtualHost
在后台进行调度时,Apache Httpd 做得很好)。
回到“可能重复的问题“,另一个解决方案可能是使用RFC 2817,正如这个答案。不幸的是,尽管这个答案提到了这个 RFC,但它显示的日志表明curl
在 SSL/TLS 流量之前没有纯 HTTP 流量,这表明它使用的是服务器名称指示 (SNI) 而不是 RFC 2817。此外,我不知道 RFC 2817 的任何实现,而curl
在回答时已经支持 SNI。
支持 RFC 2817 比支持端口统一要复杂得多,因为它需要客户端和服务器端的支持,包括在协议中间升级的能力。(这不是世界末日,SMTP、LDAP 和其他协议都可以做到这一点,但它已经得到这些协议的广泛支持。)
相比之下,端口统一只需要改变服务器端的初始调度机制。只要在 URL 中明确指定端口,任何浏览器都会在客户端支持它。
答案2
这不起作用。每个端口只能绑定一项服务。
答案3
两个服务不能使用 TCP 在同一系统上监听同一端口。 您可以使用 NAT 并将来自不同位置的流量路由到同一端口上的不同内部地址,但外部 IP 不能在同一端口上使用这两种服务。
答案4
当用户代理或客户端发起 HTTPS 请求时,它使用默认端口443
。HTTP 的默认端口是80
。
如果你的服务器正在监听另一个端口(91),那么你需要将端口 443 转发到此端口,这样当有人输入https://www.example.com/,它将指向监听端口 91 的服务器。
你不能有http://www.example.com/和https://www.example.com/运行于同一端口,因为每个端口只能有一个进程监听。如果服务器有多个 IP 地址,您可以让它们监听同一台服务器。
如果您的服务器只有 https 站点然后将 443 转发到 91 并将服务器切换到 HTTPS 即可。