我在前两篇文章中展示了“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事件处理程序,在事件处理程序中编写一些代码。

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

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

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

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

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

  1. procedure TForm7.kbmMWTCPIPIndyServerTransport1Connect(AContext: TIdContext);
  2. begin
  3. if AContext.Connection.IOHandler is TIdSSLIOHandlerSocketBase then
  4. TIdSSLIOHandlerSocketBase(AContext.Connection.IOHandler).
  5. PassThrough:=false;
  6. end;

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

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

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

  1. procedure TForm7.FormCreate(Sender: TObject);
  2. begin
  3. ORM:=TkbmMWORM.Create(kbmMWSQLiteConnectionPool1);
  4. ORM.CreateTable(TContact);
  5.  
  6. // Make sure that the server is now listening on port 443 which is
  7. // the default port for HTTPS communication.
  8. kbmMWTCPIPIndyServerTransport1.Bindings.Items[].Port:=;
  9. IdServerIOHandlerSSLOpenSSL1.SSLOptions.CertFile:='YourCertificateFile.cer';
  10. IdServerIOHandlerSSLOpenSSL1.SSLOptions.KeyFile:='YourPrivateKeyFile.key';
  11.  
  12. // Optional root certificate file if purchased certificate or empty if self signed.
  13. IdServerIOHandlerSSLOpenSSL1.SSLOptions.RootCertFile:='';
  14. kbmMWTCPIPIndyServerTransport1.IdTCPServer.IOHandler:=IdServerIOHandlerSSLOpenSSL1;
  15.  
  16. kbmMWServer1.AutoRegisterServices;
  17. kbmMWServer1.Active:=true;
  18. 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. ovs-ofctl: s1 is not a bridge or a socket 解决方法

    参考: ovs-vsctl: Error detected while setting up bridge ovs-ofctl: s1 is not a bridge or a socket 解决方法 ...

  2. UVa 821 网页跳跃(Floyd)

    https://vjudge.net/problem/UVA-821 题意:给出一个有向图,任意两点都可相互到达,求任意两点的最短距离的平均值. 思路:求两点的最短距离,用Floyd算法很方便,最后加 ...

  3. UVa 12563 劲歌金曲(0-1背包)

    https://vjudge.net/problem/UVA-12563 题意: 在一定的时间内连续唱歌,最后一首唱11分钟18秒的劲歌金曲,问最多能长多长时间. 思路: 0-1背包问题,背包容量为t ...

  4. ICM Technex 2017 and Codeforces Round #400 (Div. 1 + Div. 2, combined) D. The Door Problem 2-SAT

    题目链接:http://codeforces.com/contest/776/problem/D D. The Door Problem time limit per test 2 seconds m ...

  5. hdu 2795 Billboard 线段树+二分

    Billboard Time Limit: 20000/8000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Probl ...

  6. Java中的hashcode方法

    一.hashCode方法的作用 对于包含容器类型的程序设计语言来说,基本上都会涉及到hashCode.在Java中也一样,hashCode方法的主要作用是为了配合基于散列的集合一起正常运行,这样的散列 ...

  7. TinyXml节点查找及修改

    参考:http://blog.csdn.net/zww0815/article/details/8083550 // 读者对象:对TinyXml有一定了解的人.本文是对TinyXml工具的一些知识点的 ...

  8. Codeforces 899E - Segments Removal

    899E - Segments Removal 思路:priority_queue+pair 代码: #include<bits/stdc++.h> using namespace std ...

  9. SVN使用流程

  10. HTTP协议的请求与响应和CSS属性和定位

    HTTP协议的请求与响应和CSS属性和定位 一.HTTP协议 1.1 HTTP定义 HTTP(Hypertext Transport Protocol),超文本传输协议. 一种详细规定了浏览器和web ...