繁体   English   中英

使用SSL加密创建idhttpserver

[英]creating idhttpserver with ssl encryption

我对delphi不太满意,但是基于一些示例,我设法创建了一个不超过10个用户的简单http服务器。
有2个主要问题,我尚不知道如何解决。

  1. 验证,管理用户的正确方法-会话
  2. 主要问题是,连接必须安全,因此需要SSL加密,如何实现?

我发现的与idhttpserver和openssl有关的任何示例都不十分完整,也与Indy的旧版本无关。

我目前正在使用带有Indy 10组件的Delphi XE2。

验证,管理用户的正确方法-会话

TIdHTTPServer为您管理HTTP会话,如果你设置的TIdHTTPServer.SessionState属性为true(这是默认为false)。 TIdHTTPServer使用cookie进行会话管理,因此您的客户端需要启用cookie。

身份验证必须手动执行,但是如何执行取决于您的客户端使用的是基于HTTP的身份验证还是基于HTML的身份验证。

对于HTTP身份验证,有可用的ARequestInfo.UserNameARequestInfo.Password属性。 如果无效,则将适当的401响应发送回客户端(如果将AResponseInfo.AuthRealm属性设置为非空字符串, TIdHTTPServer将为您发送401响应)。 默认情况下, TIdHTTPServer仅支持BASIC身份验证。 如果要支持其他身份验证方案,则必须使用TIdHTTPServer.OnParseAuthentication事件,并手动发送401答复,以便可以发送回适当的WWW-Authenticate标头。 无论哪种方式,如果客户端均已验证,则可以使用HTTP会话来使客户端在两次请求之间保持登录状态。 AResponseInfo.SessionAResponseInfo.Session属性指向当前会话。 如果TIdHTTPServer.AutoStartSession为true(默认情况下为false),则TIdHTTPServer自动创建新会话。 否则,您可以在需要时自己调用TIdHTTPServer.CreateSession() TIdHTTPSession具有一个Content属性,您可以在其中存储特定于会话的数据。或者您可以从TIdHTTPSession派生一个新类,然后使用TIdHTTPServer.OnCreateSession事件创建该类的实例。

对于HTML身份验证,根据配置HTML的方式,您有两种选择:

  1. 如果您的HTML <form>标记不具有enctype属性,或者将其设置为application/x-www-webform-urlencoded ,则TIdHTTPServer会将原始ARequestInfo.FormParams表单数据存储在ARequestInfo.FormParams属性中,并且TIdHTTPServer.ParseParams为true (默认情况下),数据也将为您解析到ARequestInfo.Params属性中。

  2. 如果您的HTML <form>标记的enctype属性设置为multipart/form-data ,那么您将必须手动解析ARequestInfo.PostStream的内容,因为TIdHTTPServer尚未为您解析该数据(示例已发布多次)在许多不同的论坛上讨论过如何使用Indy的TIdMessageDecoderMIME类手动解析该数据)。 默认情况下, ARequestInfo.PostStream指向TMemoryStream对象。 如果需要,可以使用TIdHTTPServer.OnCreatePostStream事件创建不同的TStream派生类的实例。

主要问题是,连接必须安全,因此需要SSL加密,如何实现?

激活服务器之前:

  1. TIdServerIOHandlerSSLBase派生的组件(例如TIdServerIOHandlerSSLOpenSSL分配给TIdHTTPServer.IOHandler属性,并根据需要进行配置(证书,对等验证,SSL版本等)。 对于OpenSSL,如果尚未在目标OS上预先安装2个OpenSSL库二进制文件libeay32.dllssleay32.dll (或非Windows平台等效文件),则必须将它们与应用程序一起部署。希望确保您的应用使用特定版本的OpenSSL。 目前,OpenSSL是Indy本地支持的唯一加密方法,但是有可用的与Indy兼容的第三方解决方案,例如EldoS SecureBlackbox

  2. 填写TIdHTTPServer.Binding属性,并TIdHTTPServer.Binding绑定所需的HTTPS端口(443是默认的HTTPS端口)。 通常,您应该创建2个绑定,一个用于HTTP端口80,一个用于HTTPS端口443。在OnCommand...处理程序中,如果收到要求进行SSL / TLS加密的请求,则可以检查该请求是在哪个端口上进行的。 ( AContext.Binding.Port ),如果不是HTTPS,则重定向( AResponseInfo.Redirect() ),客户端在HTTPS端口上重试请求。

  3. TIdHTTPServer.OnQuerySSLPort事件分配一个处理程序,并使其APort参数与您的HTTPS端口匹配时,将其VUseSSL参数设置为True。 从SVN版本5461开始更新 ,如果您唯一的HTTPS端口是443 不再需要 OnQuerySSLPort处理程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM