2017-08-25 156 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'拥有。 –