使用ssl加密创建idhttpserver

时间:2015-12-22 12:30:25

标签: delphi ssl openssl delphi-xe2

我还不熟悉delphi,但基于一些例子,我设法创建了简单的http服务器,用户不超过10个。
有两个主要问题我不知道如何解决。

  1. 验证,管理用户的适当方式 - 会话
  2. 主要问题,连接必须是安全的,所以需要SSL加密,如何实现呢?
  3. 我发现与idhttpserver和openssl有关的任何例子都不完整或者版本较旧的Indy。

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

1 个答案:

答案 0 :(得分:3)

  

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

如果设置TIdHTTPServer属性为true,则

TIdHTTPServer.SessionState为您管理HTTP会话(默认情况下为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为真(默认情况下为false),则TIdHTTPServer会自动创建新会话。否则,您可以在需要时自己致电TIdHTTPServer.CreateSession()TIdHTTPSession具有Content属性,您可以在其中存储特定于会话的数据。或者,您可以从TIdHTTPSession派生新类,然后使用TIdHTTPServer.OnCreateSession事件创建那个班。

对于HTML身份验证,您有两种选择,具体取决于您配置HTML的方式:

  1. 如果您的HTML <form>标记没有enctype属性,或者设置为application/x-www-webform-urlencoded,则TIdHTTPServer会将原始网络表单数据存储在ARequestInfo.FormParams属性,如果TIdHTTPServer.ParseParams为真(默认为默认值),则数据也将被解析为ARequestInfo.Params属性。

  2. 如果您的HTML <form>标记的enctype属性设置为multipart/form-data,则必须手动解析ARequestInfo.PostStream的内容,如{{ 1}}还没有为你解析这些数据(以前在很多不同的论坛上已经多次发布了关于如何使用Indy的TIdHTTPServer类手动解析数据的例子)。默认情况下,TIdMessageDecoderMIME指向ARequestInfo.PostStream个对象。如果需要,您可以使用TMemoryStream事件创建不同TIdHTTPServer.OnCreatePostStream派生类的实例。

  3.   

    主要问题,连接必须是安全的,所以需要SSL加密,如何实现呢?

    在激活服务器之前:

    1. TStream派生的组件(例如TIdServerIOHandlerSSLBase)分配给TIdServerIOHandlerSSLOpenSSL属性,并根据需要进行配置(证书,对等验证,SSL版本,等等)。对于OpenSSL,如果尚未在目标操作系统上预安装2个OpenSSL库二进制文件TIdHTTPServer.IOHandlerlibeay32.dll(或非Windows平台等价物),则必须使用您的应用程序,或者如果您想确保您的应用使用特定版本的OpenSSL。目前,OpenSSL是Indy本身支持的唯一加密技术,但是有一些与Indy兼容的第三方解决方案,例如EldoS SecureBlackbox

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

    3. AResponseInfo.Redirect()事件分配处理程序,并在其TIdHTTPServer.OnQuerySSLPort参数与您的HTTPS端口匹配时将其VUseSSL参数设置为True。 更新从SVN rev 5461开始,APort处理程序is no longer needed,如果您唯一的HTTPS端口是443。