使用 ssl 加密创建 idhttpserver

2023-12-01

我还不擅长使用 delphi,但是根据一些示例,我已经成功创建了不超过 10 个用户的简单 http 服务器。
有两个主要问题我还不知道如何解决。

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

我发现的与 idhttpserver 和 openssl 相关的任何示例都不太完整,或者与旧版本的 Indy 相关。

我目前正在使用 Delphi XE2 和 Indy 10 组件。


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

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

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

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

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

  1. 如果你的 HTML<form>标签没有enctype属性,或者设置为application/x-www-webform-urlencoded, TIdHTTPServer将原始网络表单数据存储在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,您必须部署 2 个 OpenSSL 库二进制文件libeay32.dll and ssleay32.dll(或非 Windows 平台等效项)与您的应用程序一起使用,如果它们尚未预安装在目标操作系统上,或者如果您想确保您的应用程序使用特定版本的 OpenSSL。目前,OpenSSL 是 Indy 原生支持的唯一加密,但也有与 Indy 兼容的第三方解决方案可用,例如EldoS SecureBlackbox.

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 ssl 加密创建 idhttpserver 的相关文章

  • 什么是 boost::asio::ssl::context::load_verify_file 以及如何使用它?

    有一个谨慎的小量 boost asio ssl http en wikipedia org wiki Transport Layer Security小型 C 在线教育代码库 甚至更少boost asio ssl context load
  • Invoke-WebRequest SSL 失败?

    当我尝试使用时Invoke WebRequest我收到一些奇怪的错误 Invoke WebRequest Uri https idp safenames com Invoke WebRequest The underlying connec
  • 通过“修改日期”确定文件夹中的哪个文件是最新的?

    我需要扫描特定文件夹中的最新文件 基本上检查修改日期以查看哪个是最新的 但请记住这些文件具有随机名称 这是我到目前为止得到的 procedure TForm1 Button1Click Sender TObject begin ftp Ho
  • 在 python 2.7 中更新 openssl

    想知道是否有人可以解释 openssl 在 python2 7 中如何工作 我不确定 python 是否有自己的 openssl 或者从本地机器 env 中获取它 让我解释 如果我在Python中这样做 gt gt gt import ss
  • 我可以在 Delphi 中使用字符串“IsEmpty”方法吗

    内河码头文件 IsEmpty 方法 http docs embarcadero com products rad studio delphiAndcpp2009 HelpUpdate2 EN html delphivclwin32 Syst
  • 有什么简单的方法可以完全忽略带有 java url 连接的 ssl ?

    我正在构建一个应用程序 定期检查一些 RSS 提要是否有新内容 其中一些提要只能通过 https 访问 有些具有自签名或以某种方式损坏的证书 我仍然希望能够检查它们 请注意 安全性在此应用程序中不是问题 目标是以最小的努力访问内容 我使用此
  • 如何检查文件是否有备用数据流?

    Delphi 有没有办法检查文件是否有任何备用数据流 看一下 Win32 APIFindFirstStreamW https msdn microsoft com en us library windows desktop aa364424
  • 从不同的形式调用过程

    我正在使用 Lazarus 我有一个名为TForm1单元名称为 Unit 1 在这里我有一个名为mergeDATfile a shortint 这会产生一些东西 顺便说一句 我必须创建另一个名为TForm2里面有按钮 Button1 当它被
  • 在 ADO 查询 (mysql/MyConnector) 中使用参数

    今天我下载并安装了 MyConnector 这样我就可以通过 ADO 使用 Mysql 一切都安装好了 我可以与 ODBC 连接并从我的 delphi 环境进行连接 当我在运行时构建查询时 我收到一条错误消息 项目 Project1 exe
  • OpenSSL 未签名证书静默

    遇到了麻烦 还有其他一些相关的帖子 但没有那么具体 我正在尝试为开发机器默默地生成证书 这些是我最初运行的命令 但被要求输入密码 openssl genrsa des3 out server key 1024 openssl req new
  • 在该对象调用的事件期间销毁该对象

    我有一个按钮 它的 OnClick 事件调用一个销毁按钮的过程 但随后 线程 想要返回到 OnClick 事件 并且我遇到了访问冲突 我完全被难住了 您需要在按钮的所有代码执行完毕后销毁该按钮 执行此操作的标准方法是将用户定义的消息发布到表
  • 构建机器是否需要单独的 Delphi XE4 许可证?

    用于通过以下方式构建应用程序dcc32在构建服务器上我可以使用 Delphi Trial 这种方法的许可证没有任何问题 现在 我将通过以下方式在 TeamCity 上构建 Delphi XE4 应用程序msbuild 我是否需要拥有构建机器
  • 使用 facebook sdk 为应用程序生成哈希密钥

    我正在使用 facebook sdk 登录我的应用程序 该应用程序在 HTC 设备上运行良好 如果没有预装 Facebook 应用程序 该应用程序也可以在三星设备上正常运行 但是 如果移动设备上已经有 facebook 应用程序 然后用户安
  • SMTP:无法连接套接字:无法找到套接字传输“ssl”

    我一直在尝试在 WAMP 上使用 Pear 发送电子邮件通过 GMail 花了几个小时将其全部设置并找出我遇到的所有错误后 我以为我已经很接近了 直到我开始收到此错误 Failed to connect to ssl smtp gmail
  • 为什么不提高EInvalidPointer?

    德尔福文档状态 http docwiki embarcadero com Libraries en System SysUtils EInvalidPointer 切勿提出E无效指针直接异常 E无效指针由内存管理器内部引发 我正在编写一个自
  • 导入证书时CRYPT_E_NOT_FOUND

    我正在尝试自动生成证书签名请求的过程 然后从 Windows Server 2012 R2 服务器上的 CA 导入响应 以用作 IIS 中 SSL 绑定的证书 我能够生成 CSR 然后将其提供给安全团队 然后安全团队为我提供响应 然后导入
  • 将包含所有证书链的 P7b 文件导出到 CER 文件中

    我有 Thwate 提供的 p7b 文件 当我尝试使用以下命令导出 cer 文件中的证书时 不包括证书链 请建议如何做同样的事情 导入到 weblogic 密钥存储中需要此 CER openssl pkcs7 print certs in
  • 对 Rails 3.1 中的特定路由强制使用 SSL

    我需要强制启用 SSL所有路线在我的申请中除了landing index In config application rb 我有 config force ssl true Then in landing controller rb 我有
  • Android - 除了普通 SSL 证书之外还验证自签名证书

    我有一个通过 SSL 调用 Web 服务的 Android 应用程序 在生产中 我们将拥有由受信任的 CA 签名的普通 SSL 证书 但是 我们需要能够支持自签名证书 由我们自己的 CA 签名 我已经成功实施了接受自签名证书的建议解决方案
  • 仅在 Tomcat Web 应用程序上为表单登录设置 SSL

    我是否可以将 Tomcat 或我的 web 应用程序 如果这样做 设置为需要 SSL 来保证内置基于表单的登录机制的机密性 即保护用户凭据 并使用标准 http 进行任何其他交易 您可以将登录表单放在自己的目录中 并且只需对该目录要求 SS

随机推荐

  • 更改单个 ASP.NET Core 控制器的 JSON 序列化设置

    我有两个控制器 ControllerA and ControllerB 每个控制器的基类是Controller The ControllerA需要以默认格式 camelCase 返回 JSON 这ControllerB需要以不同的 JSON
  • 如何绘制 ggplot 树形图?

    我希望在地图上获得这种渐变颜色 ramp lt colorRamp c royalblue4 white ramp list lt rgb ramp seq 0 1 length 15 max 255 而且 更重要的是 我希望向图表添加情节
  • 来自 C++ 的 C# USB 驱动程序:SetupDiGetDeviceInterfaceDetail

    我在尝试从 C 调用 SetupDiGetDeviceInterfaceDetail 时遇到问题 它始终返回 1784 错误代码 提供的用户缓冲区对于请求的操作无效 这是我的 C 代码 Guid GUID DEVINTERFACE DFU
  • UnicodeEncodeError: 'ascii' 编解码器无法对位置 0 处的字符 u'\xef' 进行编码:序数不在范围内 (128)

    我想解析我的 XML 文档 所以我存储了我的 XML 文档 如下所示 class XMLdocs db Expando id db IntegerProperty name db StringProperty content db Blob
  • 没有鉴别器列的 EclipseLink JPA 继承

    我有一个 Client 和 Affiliate 类 继承自 Person 类 正在使用联合继承策略类型 每个继承策略都与父类共享主键 由于没有鉴别器列 我们选择使用描述符定制器和类提取器 但它并没有真正给出任何它是如何工作的想法 而且代码似
  • 如何在 maven pom.xml 中定义属性并从命令行传递参数?

    我需要传递两个参数 比如说shell and version从命令行 问题是我无法理解如何定义这两个变量pom xml 然后在运行时获取我的 Java 代码中的参数 另外 当我将其作为 Maven 项目运行时 如何设置参数值 任何建议都会有
  • 某些 UTF-8 字符在浏览器上不显示

    某些 UTF 8 字符如 C2 96 连字符 的 UTF 8 等效字符 在浏览器上它显示为 带有 00 96 的 utf 框 而不是 连字符 这种行为有什么原因吗 我们该如何纠正这个问题 http stuffofinterest com m
  • 为什么 SQL Server 中的临时表没有从 tempdb 中删除?

    我创建了一个包含 7 个临时表的存储过程 每个临时表在其工作结束时都会被删除 我从一个 Web 服务调用 SP 并且我们在不同的实例中使用相同的 Web 服务 我已强制删除每个临时表 但是当 SP 执行时 它不会删除位于 tempdb 临时
  • 使用 Django auth UserAdmin 进行自定义用户模型

    来自Django Contrib Auth 文档 扩展 Django 的默认用户如果您对 Django 的 User 模型完全满意 并且只想添加一些额外的个人资料信息 您可以简单地子类化django contrib auth models
  • DataSnap XE2 和 TStream 方法参数

    我正在 Delphi XE2 中使用 TCP IP 协议开发 DataSnap 项目 该项目需要将二进制数据流作为方法参数传递到服务器 我遇到的问题是流内容似乎有大约 32 KB 的大小限制 超出此限制 服务器接收到的流为空 如果我传递其他
  • 使用经典 ASP 从 COM 对象检索字符串数组

    我有一个 NET 类 它包含通过访问器方法可用的简单字符串数组 如下所示 namespace Foo Bar ComVisible true Guid 642279A0 85D4 4c7a AEF5 A9FAA4BE85E5 public
  • hibernate.enable_lazy_load_no_trans 不起作用

    我正在使用 JPA2 1 和 hibernate 4 3 8 并且我已配置 persistence xml 以允许延迟加载 我已经添加了
  • 3D Touch 冻结我的应用程序

    也许我的问题等于 如果轻轻触摸 力触动画会冻结 iPhone 6s 中的 peek and pop 实施中应用程序冻结 1 无 bug 的强制触摸 一个UITransitionView创建图层是为了预览我的视图控制器 它工作完美 2 用 b
  • 一个函数在内存中只存储一次吗?

    当我们在对象或全局中的任何地方定义函数时 javascript函数是否会存储在内存中一次 function alert some value obj m function alert some value 如果您定义该函数一次 并将该函数的
  • Dataproc Hive 操作员未运行存储桶中存储的 hql 文件

    我正在尝试使用气流脚本运行云存储中存在的 hql 文件 我们可以通过两个参数将路径传递给 DataprocHiveOperator 查询 gs bucketpath filename q Error occuring cannot reco
  • 如何在Android 11中调整手机屏幕中的应用程序?

    在 Android 11 之前 我已经轻松地将我的应用调整为全屏 我的旧手机的摄像头孔和基本按钮位于屏幕区域之外 我的新手机的摄像头孔和基本按钮位于屏幕区域内 经过很少的设置 我的应用程序在旧手机上全屏显示 样式 xml
  • 用分号连接字符串数组

    这是一种经常出现在我们框架的一部分中的模式 给定一个字符串数组 我们必须将所有字符串连接起来 并用分号分隔 我想知道可以用哪种优雅的方式来完成 我在我们的代码库中看到了一些变化 而且当我必须这样做时 我总是必须再次重新考虑 我目前的模式是这
  • AVUrlAsset 和 WebVTT

    在 iOS TVOS 上 是否可以从 URL 加载远程 vtt 文件并将其用作字幕轨道 同时还从 URL 加载远程 HLS 视频 而不是在 m3u8 播放列表中指定的 VTT 伪代码 AVAsset video asset AVAsset
  • 如何在编辑表单中使用 DoctrineModule\Validator\NoObjectExists - Zend Framework 2 和 Doctrine 2

    最有效的使用方法是什么DoctrineModule Validator NoObjectExistsZend Form 中的验证器也用于编辑 因为当我使用相同的表单来保存编辑的值时 这会验证对象存在并标记表单无效 几周前 我在自定义过滤器中
  • 使用 ssl 加密创建 idhttpserver

    我还不擅长使用 delphi 但是根据一些示例 我已经成功创建了不超过 10 个用户的简单 http 服务器 有两个主要问题我还不知道如何解决 验证 管理用户的正确方法 会话 主要问题是 连接必须安全 所以需要SSL加密 如何实现 我发现的