如何在Delphi XE3中使用TIdTCPServer和OpenSSL在同一端口上支持SSL和非SSL流量?

前端之家收集整理的这篇文章主要介绍了如何在Delphi XE3中使用TIdTCPServer和OpenSSL在同一端口上支持SSL和非SSL流量?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试使用Indy和OpenSSL在Delphi XE3中设置一个Web服务器,它可以在同一端口上通过HTTP和HTTPS连接提供流量.

我已经看到了两种主要的方法,似乎都不适合我.

第一种:前期TLS / SSL.这涉及读取流的前几个字节以查找非安全握手的“Client-Hello”部分和(如果找到)调用服务器SSL握手响应,但是如果我这样做,则OpenSSL库无法识别握手,因为我已经剥离了消息的前导字节.

第二:STARTTLS之后的TLS(或等效的).这涉及发送一组特殊字符(STARTTLS),紧接着是“Client-Hello”.然后,服务器保留完整的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流量?

解决方法

开箱即用的Indy无法满足您的要求.它的默认SSL实现使用OpenSSL的传统API,它可以完成所有自己的套接字I / O,因此需要直接访问完整的握手数据,而不必先查看数据.但是,一切都不会丢失.你有几个选择:

1)在套接字将其提供给您的应用程序之前,使用libpcap / Winpcap捕获并查看新连接的原始数据的前几个字节.

2)编写自己的TIdioHandler派生类,该类使用OpenSSL的新BIO API或Microsoft的SChannel API,因此您可以控制套接字I / O并自己读取传入的字节并在将它们推入加密引擎进行处理之前查看它们.

原文链接:https://www.f2er.com/delphi/453121.html

猜你在找的Delphi相关文章