IdMappedPortTCP OnOutboundConnect SSL支持
我试图创建一个简单的程序,允许不支持SSL的客户端通过SSL进行通信。IdMappedPortTCP OnOutboundConnect SSL支持
基本上,IdMappedPortTCP接受来自客户端的非加密(不是SSL),并通过SSL将数据转发到指定的MappedHost和MappedPort属性。
到目前为止,我试图在OnOutboundConnect事件下面的代码,但它似乎不工作:它
AContext.Connection.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(AContext.Connection);
觉得作为安全通道(SSL/TLS代理)
您的简单版本在错误的事件中分配错误的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;
像往常一样你的男人!感谢您的澄清。我想“出站”的事情让我感到困惑。我不认为我需要“释放”任何资源,因为它会自动释放。 – MakeG
@MakeG:在隧道scenerio中,您有一个连接到'TIdMappedPortTCP'('AContext')的入站客户端和一个连接到映射目标服务器('AContext.OutboundClient')的出站客户端。而且你对于对象生命周期是正确的,因为除了由'OutboundClient'拥有的SSLIOHandler之外,所有东西都由'TIdMappedPortTCP'拥有。 –
当我说“不工作”,我的意思是,IOHandler被忽略,甚至是程序不抱怨缺少OpenSSL的DLL文件。 – MakeG