我在前两篇文章中展示了“REST easy with kbmMW”文章,如何使用kbmMW制作REST服务器,以及如何使用该REST服务器轻松地从数据库返回和存储数据,所有这些都在不到30行的真实数据库中码。

此文章将围绕如何确保使用SSL(安全套接字层)保持与服务器的通信受到保护。换句话说,如何使REST服务器与HTTPS而不是HTTP进行通信。

有多种方法可以使用SSL保护基于kbmMW的应用程序服务器,但我将重点介绍使用OpenSSL执行此操作的一种简单方法。

首先,我们应该创建一个可以使用的证书。SSL证书可以从销售官方证书的各个地方购买,也可以创建自签名证书。自签名证书通常与其他任何内容一样安全,但其他服务器不会自动信任它,这可能会将您的证书标记为不安全。

然而,对于内部使用,自签名证书通常就很好了。

互联网上有很多地方解释了如何使用OpenSSL创建SSL证书的过程。您可以单击此处查看其中一个。

在您获得购买或自制证书后,我们可以继续将其与REST服务器集成。

TIdServerIOHandlerSSLOpenSSL组件添加到主窗体(Unit7)

您需要设置它的SSLOptions属性,如下所示:

  • SSLOptions.Mode必须是sslmServer
  • 在支持的SSLOptions.SSLVersions中,我建议仅启用sslvTLSv1_2

暂时保留其余属性。

现在双击IdServerIOHandlerSSLOpenSSL1组件的OnGetPassword事件处理程序,在事件处理程序中编写一些代码。

procedure TForm7.IdServerIOHandlerSSLOpenSSL1GetPassword(var Password: string);
begin
Password:='yourCertificatePassword';
end;

事件中的代码应该只返回您在创建证书的私有部分时使用的密码。OpenSSL需要访问它才能使用您的私钥。

尽管有上面的例子,我建议你,不要在你的应用程序内部硬编码,而是出于安全原因从外部配置文件中读取密码,以防你的REST服务器可执行文件泄漏到其他地方。

但对于当前例子,使用自制证书,我们可以使用硬编码密码。

接下来我们需要告诉kbmMW服务器端传输让OpenSSL代码处理我们数据的主要通信。其中一部分是为kbmMWTCPIPIndyServerTransport1组件的OnConnect事件  编写事件处理程序。

procedure TForm7.kbmMWTCPIPIndyServerTransport1Connect(AContext: TIdContext);
begin
if AContext.Connection.IOHandler is TIdSSLIOHandlerSocketBase then
TIdSSLIOHandlerSocketBase(AContext.Connection.IOHandler).
PassThrough:=false;
end;

为了使编译器能通过,我们还需要将IdContext添加到接口uses子句中。

最后,我们需要将SSL组件链接到服务器传输,并使证书文件可用于OpenSSL。

我们通过编写以下代码来实现这一点,例如在主窗体的OnCreate事件处理程序中(包含kbmMW Indy服务器传输)。

procedure TForm7.FormCreate(Sender: TObject);
begin
ORM:=TkbmMWORM.Create(kbmMWSQLiteConnectionPool1);
ORM.CreateTable(TContact); // Make sure that the server is now listening on port 443 which is
// the default port for HTTPS communication.
kbmMWTCPIPIndyServerTransport1.Bindings.Items[].Port:=;
IdServerIOHandlerSSLOpenSSL1.SSLOptions.CertFile:='YourCertificateFile.cer';
IdServerIOHandlerSSLOpenSSL1.SSLOptions.KeyFile:='YourPrivateKeyFile.key'; // Optional root certificate file if purchased certificate or empty if self signed.
IdServerIOHandlerSSLOpenSSL1.SSLOptions.RootCertFile:='';
kbmMWTCPIPIndyServerTransport1.IdTCPServer.IOHandler:=IdServerIOHandlerSSLOpenSSL1; kbmMWServer1.AutoRegisterServices;
kbmMWServer1.Active:=true;
end;

确保文件YourCertificateFile.cerYourPrivateKeyFile.key在运行时可用于REST可执行文件,但也要确保无法为其他任何人下载它们。这些文件(以及您的私钥密码)对其他任何人来说都是一个秘密,这一点非常重要。

您可能会注意到,我们将第一个绑定的端口号从80更改为443,因为我们希望支持标准HTTPS端口。您可能还注意到可以提供根证书文件。根证书文件通常包含一系列公共证书,OpenSSL和浏览器可以使用它们来验证您自己的证书是由具有根证书的实体生成的有效且可信的证书。

自签名证书通常不需要任何根证书文件。

现在,您的REST服务器已准备好通过SSL安全地为客户端提供服务了!

REST easy with kbmMW #3 – SSL的更多相关文章

  1. REST easy with kbmMW #14 – DB Controlled login

    介绍 关于如何使用授权和登录管理来构建应用服务器还存在一些问题,其中之一就是用户及其角色如何在在数据库中定义.该文将解释使用TkbmMWAuthorizationManager解决此问题的一种方法.有 ...

  2. REST easy with kbmMW #4 – Access management

    在前面有关如何使用kbmMW创建REST服务器的基础上,现在已经到了考虑该如何控制用户的访问.什么是访问管理?就是“允许谁做什么"的问题. 显然,这个世界中存在数据,应该保护他而不被未授权的 ...

  3. REST easy with kbmMW #15 – Handling HTTP POST

    我被问到有关如何通过基于kbmMW智能服务(Smart Service)的REST处理POST的问题. 这篇博客文章解释了典型的POST各种形式的访问,以及如何在kbmMW中处理它们. POST变种W ...

  4. REST easy with kbmMW #24 使用kbmMW实现JSON/XML/YAML转换成对象

    你想过没有,把一个给定的xml或json生成一个Delphi类,并通过这个类完成对xml或json的读写操作吗? 不管有没有,现在kbmMW为我们实现了,看下面这行代码: var s:string; ...

  5. REST easy with kbmMW #21 – Delphi client stubs

    在之前的博文中,我提到新的存根生成器框架具有生成Delphi客户端存根所需的功能,使得开发Delphi智能客户端非常容易,完全支持编译时的类型检查和IDE类/属性帮助. 我没想到会把它包含在即将发布的 ...

  6. REST easy with kbmMW #20 – OpenAPI and Swagger UI

    即将推出的kbmMW更新不仅是一些bug修正,同时将包含一个新的主要功能:客户端存根生成器框架. 那什么是客户端存根生成器框架呢? 他是一个基于kbmMW smart services,可以生成由各种 ...

  7. REST easy with kbmMW #17 – Database 6 – Existing databases

    kbmMW已经包含了非常精细的功能来确定和解释数据库中表的元数据. 在下一版本中,这个功能将得到进一步加强,可以导入现有数据库中的表,自动创建与表相匹配的ORM实体类. 这意味着你能够使用kbmMW的 ...

  8. REST easy with kbmMW #16 – Multiple servers using HTTP.sys transport

    前文写过使用HTTP.sys转输层(TkbmMWHTTPSysServerTransport),实现一个kbmMW应用服务器. 如果在一台服务器上,同时运行多个,基于TkbmMWHTTPSysServ ...

  9. REST easy with kbmMW #1

    kbmMW 5.0支持REST服务器的开发,并且非常简单,下面看看如何实作一个REST服务器. 首先我们制作一个服务器应用程序,增加一个简单的Form,并放置kbmMW组件. 在Delphi中单击Fi ...

随机推荐

  1. Django Python MySQL Linux 开发环境搭建

    Django Python MySQL Linux 开发环境搭建 1.安装Python 进行Python开发,首先必须安装python,对于linux 或者Mac 用户,python已经预装. 在命令 ...

  2. 机器学习-数据可视化神器matplotlib学习之路(五)

    这次准备做一下pandas在画图中的应用,要做数据分析的话这个更为实用,本次要用到的数据是pthon机器学习库sklearn中一组叫iris花的数据,里面组要有4个特征,分别是萼片长度.萼片宽度.花瓣 ...

  3. bash 判断两个文件相等的代码

    #!/bin/bash #定义参数 username="xxx" passwd="xxxxxxxx" dbname="xxx" #判断入参为 ...

  4. selenium-webdriver 简单教程

    ruby环境下selenium/webdriver可以通过selenium-webdriver.gem包进行安装 gem install selenium-webdriver   支持语言及版本有ru ...

  5. Java注册帐号邮箱激活验证实现

    Java注册帐号邮箱激活验证实现 1.需要加入发送邮件的mail.jar: http://www.oracle.com/technetwork/java/javamail/index-138643.h ...

  6. Beta冲刺三——《WAP团队》

    β冲刺第三天  1. 今日完成任务情况以及遇到的问题. ①马麒.杜有海:管理员审核表的进一步完善 ②郝明宇:登录.注册界面的完善 ③马宏伟.周欣:继续完善前端数据借用与后台的连接 ④乌勒扎:登录与注册 ...

  7. 缓存地图 ArcGIS ——Local compact and exploded tile cache layer for WPF API

      ArcGISArcGIS 主页 特色 合约 图库 地图 组 帮助 我的内容 我的组织 登录 我的个人资料 帮助 管理员指南 登出 0 搜索全部内容 搜索地图 搜索图层 搜索应用程序 搜索工具 搜索 ...

  8. Mishka and Divisors CodeForces - 703E

    大意: 给定$n$个数, 求选择最少的数满足积为$k$的倍数, 并且和最小 刚开始想着暴力维护$k$的素因子向量, 用map转移, 结果T了. 看了下别的dala0题解, 不需要考虑素因子, 我们考虑 ...

  9. 硬盘分区表知识——详解硬盘MBR (转)

    Ref: http://www.blogjava.net/galaxyp/archive/2010/04/25/319344.html 硬盘是现在计算机上最常用的存储器之一.我们都知道,计算机之所以神 ...

  10. jsp jsp标签

    JSP标签页称为Jsp Action(JSP动作元素),用于在Jsp页面中提供业务逻辑功能,避免在Jsp页面中直接编写java代码,造成jsp页面难以维护. jsp常用标签 jsp:include标签 ...