And*_*ndy 5 delphi ssl openssl http indy
我正在尝试使用Indy和OpenSSL在Delphi XE3中设置一个Web服务器,它可以在同一端口上通过HTTP和HTTPS连接提供流量.
我已经看到了两种主要的方法,似乎都不适合我.
第一种:前期TLS/SSL.这涉及读取流的前几个字节以查找非安全握手的"Client-Hello"部分和(如果找到)调用服务器SSL握手响应,但是如果我这样做,则OpenSSL库无法识别握手,因为我已经剥离了消息的前导字节.
第二:STARTTLS之后的TLS(或等效的).这涉及发送一组特殊字符(STARTTLS),紧接着是"Client-Hello".然后,服务器保留完整的SSL握手消息,以传递给OpenSSL库.这种方法的问题是大多数Web浏览器不支持它(RFC 2817).
有关这两种方法的摘要,请查看此处: 设置TLS/LDAP或TLS/HTTP连接时,线路上会发生什么?)
如何在Delphi XE3中使用TIdHTTPServer和OpenSSL在同一端口上支持SSL和非SSL流量?
Indy 开箱即用,无法满足您的要求。 Indy 的默认 SSL 实现使用 OpenSSL 的传统 API,它执行自己的所有套接字 I/O,因此它需要直接访问完整的握手数据,而无需让您先查看数据。然而,一切并没有失去。您有几个选择:
1) 在套接字将原始数据提供给应用程序之前,使用 libpcap/Winpcap 捕获并查看新连接的前几个字节的原始数据。
2) 编写您自己的TIdIOHandler派生类,该类使用 OpenSSL 的较新 BIO API 或 Microsoft 的 SChannel API,因此您可以控制套接字 I/O,并且可以自己读取传入字节并在将它们推入加密引擎进行处理之前查看它们。
更新:实际上有第三个选项,使用 Indy 的默认类:
3) 在该TIdHTTPServer.OnQuerySSLPort事件中,将VUseSSL参数设置为False适用于所有请求,从而关闭TIdHTTPServer对 SSL/TLS 握手的自动处理。然后,在TIdHTTPServer.OnConnect事件中(在事件后触发OnQuerySSLPort),您可以直接从套接字连接中查看前几个字节(使用操作系统的套接字 APIrecv()函数以及AContext.Binding.Handle套接字句柄和MSG_PEEK标志)。如果查看的字节表示“Client-Hello”SSL/TLS 消息的开始,则将对象类型转换AContext.Connection.IOHandler为并将其属性TIdSSLIOHandlerSocketBase设置为 来启动 OpenSSL 的正常 SSL/TLS 握手处理。由于查看的字节仍位于套接字的内部缓冲区中,因此 OpenSSL 将能够读取它们。PassThroughFalse