如何在Delphi XE3中使用TIdTCPServer和OpenSSL在同一端口上支持SSL和非SSL流量?

时间:2013-04-26 14:05:16

标签: delphi http ssl openssl indy

我正在尝试使用Indy和OpenSSL在Delphi XE3中设置一个Web服务器,它可以在同一端口上通过HTTP和HTTPS连接提供流量。

我已经看到了两种主要的方法,似乎对我来说都不适用。

首先:前期TLS / SSL。这涉及读取流的前几个字节以查找非安全握手的“Client-Hello”部分和(如果找到)调用服务器SSL握手响应,但是如果我这样做,则OpenSSL库无法识别握手,因为我已经删除了消息的前导字节。

第二:STARTTLS之后的TLS(或等效的)。这涉及发送一组特殊字符(STARTTLS),紧接着是“Client-Hello”。然后,服务器保留完整的SSL握手消息,以传递给OpenSSL库。这种方法的问题是大多数Web浏览器不支持它(RFC 2817)。

有关这两种方法的摘要,请查看此处:What happens on the wire when a TLS / LDAP or TLS / HTTP connection is set up?

如何在Delphi XE3中使用TIdHTTPServer和OpenSSL在同一端口上支持SSL和非SSL流量?

2 个答案:

答案 0 :(得分:2)

我不希望用Internet Direct(Indy)这么容易实现 - Apache HTTP服务器无法做到这一点,这意味着要么a)几乎没有人想要这个功能b)它不是那么容易实施或者可能c)它可能带来安全风险。

来自https://serverfault.com/questions/359461/apache-answer-both-http-and-https-on-the-same-port

的接受答案
  

Apache无法做到这一点。使用Apache你不能   让HTTPS和HTTP在同一个端口上运行。

     

我知道有一些端口多路复用器用于制作HTTPS / OpenVPN   或SSH在同一端口上运行,但这些需要额外的软件。一世   我不知道会复用HTTPS和HTTP的工具。

答案 1 :(得分:1)

开箱即用的Indy无法满足您的要求。它的默认SSL实现使用OpenSSL的传统API,它可以完成所有自己的套接字I / O,因此需要直接访问完整的握手数据,而不必先查看数据。但是,一切都不会丢失。你有几个选择:

1)在套接字将其提供给您的应用程序之前,使用libpcap / Winpcap捕获并查看新连接的原始数据的前几个字节。

2)编写自己的TIdIOHandler派生类,该类使用OpenSSL的新BIO API或Microsoft的SChannel API,因此您可以控制套接字I / O并自己读取传入的字节并在推送之前查看它们他们进入加密引擎进行处理。