目前,我使用 http 和 https 作为不同的端口。并且根据请求 uri,我制定了从 http 到 https 的重定向规则,反之亦然。但如果我在 lighttpd 中只能为 https 和 https 使用一个端口。那将是最好的解决方案。
还有其他方法可以做到这一点吗?如果 lighttpd 本身无法做到这一点。那么 tomcat 和 lighttpd 的某种组合怎么样?仍然不可能吗?
答案1
不可行。HTTP 和 HTTPS 是两种截然不同的服务,它们的行为方式截然不同(尽管命名和负载相似)。唯一的服务必须绑定到唯一的端口,以使客户端和服务器能够以双方都理解的语言进行通信。
要实现这一点,您需要一个客户端,该客户端将连接到端口,协商要建立的连接类型(HTTP 或 HTTPS),然后切换到适当的通信模式。客户端上不存在该协商逻辑,因此您无法在服务器端实现此操作。
答案2
你想要的是启动TLS对于 HTTP。这实际上是由RFC 2817,这是在现在的 Ye Olden Days of Yon Internete 中编写的。我发现一些快速参考资料表明 Apache 和 lighthttpd 都支持这一点,但对 lighttpd 的进一步研究令人失望——对此感到抱歉。以下是使用 Apache 进行设置但是,基本上:
<VirtualHost _default_:80>
SSLEngine optional
...
</VirtualHost>
也没有客户端支持。IE7 支持一些漂亮的 TLS 扩展(基于名称的 SSL 证书在我们的有生之年可能会实现),但显然不支持 STARTTLS/RFC 2817。还有一个为 Mozilla 开放错误,还有很多细节有待解决。其中一个问题是 RFC 使得加密真的可选的,并且对于互联网上的大多数加密应用程序来说,这通常不是理想的选择。但由于您使用的是自定义客户端,因此无需担心缺少一般浏览器支持或安全问题。