2017-08-25 196 views
1

我試圖創建一個簡單的程序,允許不支持SSL的客戶端通過SSL進行通信。IdMappedPortTCP OnOutboundConnect SSL支持

基本上,IdMappedPortTCP接受來自客戶端的非加密(不是SSL),並通過SSL將數據轉發到指定的MappedHost和MappedPort屬性。

到目前爲止,我試圖在OnOutboundConnect事件下面的代碼,但它似乎不工作:它

AContext.Connection.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(AContext.Connection); 

覺得作爲安全通道(SSL/TLS代理)

+0

當我說「不工作」,我的意思是,IOHandler被忽略,甚至是程序不抱怨缺少OpenSSL的DLL文件。 – MakeG

回答

1

您的簡單版本在錯誤的事件中分配錯誤的IOHandler。

您正將連接的IOHandler分配給客戶端,而不是連接到映射服務器的IOHandler。並且在連接到映射服務器的連接建立後觸發事件。

另外,建立SSL會話時,必須將SSLIOHandler的PassThrough屬性設置爲False。這是默認的。

OnConnect事件而不是OnOutboundConnect事件,使用:

var 
    Conn: TIdTCPConnection; 
    SSL: TIdSSLIOHandlerSocketOpenSSL; 
begin 
    Conn := TIdMappedPortContext(AContext).OutboundClient; 
    SSL := TIdSSLIOHandlerSocketOpenSSL.Create(Conn); 
    SSL.PassThrough := False; 
    Conn.IOHandler := SSL; 
end; 
+0

像往常一樣你的男人!感謝您的澄清。我想「出站」的事情讓我感到困惑。我不認爲我需要「釋放」任何資源,因爲它會自動釋放。 – MakeG

+0

@MakeG:在隧道scenerio中,您有一個連接到'TIdMappedPortTCP'('AContext')的入站客戶端和一個連接到映射目標服務器('AContext.OutboundClient')的出站客戶端。而且你對於對象生命週期是正確的,因爲除了由'OutboundClient'擁有的SSLIOHandler之外,所有東西都由'TIdMappedPortTCP'擁有。 –