2013-04-26 33 views
5

我想在Delphi XE3中使用Indy和OpenSSL設置一個Web服務器,它可以通過同一端口上的HTTP和HTTPS連接提供流量。如何在Delphi XE3中使用TIdTCPServer和OpenSSL在同一端口上支持SSL和非SSL流量?

我已經看到了兩種主要的方法來此,既不似乎爲我工作。

第一:先期的TLS/SSL。這包括讀取流的前幾個字節以查找非安全握手的「Client-Hello」部分和(如果找到)調用服務器SSL握手響應,但如果我這樣做,OpenSSL庫不會識別握手,因爲我已經刪除了消息的前導字節。

第二:TLS後STARTTLS(或等同物)。這涉及到發送一組特殊的字符(STARTTLS),緊接着是「客戶 - 你好」。然後,服務器將整個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流量?

回答

1

你所要求的,是不可能的印地開箱即用。它的默認SSL實現使用OpenSSL的傳統API,它可以完成它自己的套接字I/O,因此它需要直接訪問完整的握手數據,而不需要先查看數據。但是,一切都不會丟失。您有幾個選擇:

1)使用libpcap/Winpcap捕獲並查看在套接字將其提供給應用程序之前,新連接的原始數據的前幾個字節。

2)編寫使用OpenSSL的新BIO API,或者微軟的SChannel中的API自己TIdIOHandler派生類,所以你在套接字I/O的控制,並可以自己讀進來的字節,並推動他們進入前看他們加密引擎進行處理。

+0

感謝您的替代建議!我會研究這些,如果我最終實施其中的任何一個,我會在這裏再次發佈。 – Andy 2013-04-26 16:43:25

2

我不希望這是很容易與互聯網直接(印)來實現 - Apache HTTP服務器不能做到這一點,這意味着無論是)幾乎沒有人想過這個特性B)這不是那麼容易實施或可能c)它可能引入安全風險。

從接受的答案在https://serverfault.com/questions/359461/apache-answer-both-http-and-https-on-the-same-port

這不會是可能與Apache。使用Apache,您不能在同一個端口上運行HTTPS和HTTP,因此不能使用 。

我知道有幾個端口多路複用器設計用於使HTTPS/OpenVPN 或SSH在同一端口上運行,但這些需要額外的軟件。 I 我不知道將複用HTTPS和HTTP的工具。