首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用ssl加密创建idhttpserver

使用ssl加密创建idhttpserver
EN

Stack Overflow用户
提问于 2015-12-22 12:30:24
回答 1查看 3K关注 0票数 1

我还不太擅长delphi,但根据一些例子,我已经成功地创建了一个简单的http服务器,用户不超过10个。

有两个主要的问题,我还不知道如何解决。

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

我发现的任何与idhttpserver和openssl有关的例子,都不是很完整,也不是很老版本的Indy。

我目前正在与德尔菲XE2与Indy 10组件。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-22 18:19:40

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

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

身份验证必须手动执行,但如何执行取决于客户端是使用基于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-urlencodedTIdHTTPServer将将原始webform数据存储在ARequestInfo.FormParams属性中,如果TIdHTTPServer.ParseParams为true (默认情况下为ARequestInfo.FormParams),则数据也将被解析为ARequestInfo.Params属性。
  2. 如果HTML标记的<form>属性设置为multipart/form-data,则必须手动解析ARequestInfo.PostStream的内容,因为TIdHTTPServer还没有为您解析该数据(以前在许多不同的论坛上都有关于如何使用Indy的TIdMessageDecoderMIME类手动解析数据的示例)。默认情况下,ARequestInfo.PostStream指向TMemoryStream对象。如果需要,可以使用TIdHTTPServer.OnCreatePostStream事件创建不同TStream-derived类的实例。

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

激活服务器之前:

  1. TIdServerIOHandlerSSLBase-derived组件(如TIdServerIOHandlerSSLOpenSSL )分配给TIdHTTPServer.IOHandler属性,并根据需要配置它(证书、对等验证、SSL版本等)。在OpenSSL的情况下,如果应用程序尚未在目标操作系统上预装,或者希望确保应用程序使用特定版本的OpenSSL,则必须使用应用程序部署2 OpenSSL库二进制文件libeay32.dllssleay32.dll (或非Windows平台等效程序)。此时,OpenSSL是Indy本机支持的唯一加密,但是有一些与Indy兼容的第三方解决方案,比如EldoS SecureBlackbox
  2. 使用所需的HTTPS端口的绑定填充TIdHTTPServer.Binding属性(443是默认的HTTPS端口)。通常,您应该创建2个绑定,一个用于HTTP端口80,一个用于HTTPS端口443。在OnCommand...处理程序中,如果收到要求SSL/TLS加密的请求,则可以检查请求所在的端口(AContext.Binding.Port),如果没有HTTPS,则可以重定向(AResponseInfo.Redirect())客户端,以便在HTTPS端口上重试请求。
  3. TIdHTTPServer.OnQuerySSLPort事件分配一个处理程序,并让它在其VUseSSL参数与HTTPS端口匹配时将其APort参数设置为True。更新,从SVN 5461开始,如果您的HTTPS端口只有443,则为OnQuerySSLPort处理程序不再需要
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34415978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档