我在前两篇文章中展示了“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. UVa 1471 防线

    https://vjudge.net/problem/UVA-1471 题意:给出一个序列,删除一个连续子序列,使得剩下的序列中有一个长度最大的连续递增子序列,输出个数. 思路:首先可以计算出以i结尾 ...

  2. Elasticsearch 多字段搜索

    查询很少是对一个字段做 match 查询,通常都是一个 query 查询多个字段,比如一个 doc 有 title.content.pagetag 等文本字段,要在这些字段查询含多个 term 的 q ...

  3. nginx 80 端口默认被占用

    /etc/nginx/sites-enabled,修改该目录下的default文件, 将默认端口号80改为其他端口号, /etc/nginx/nginx.conf 文件配置里的80端口就会生效

  4. Ubuntu14.04(server amd 64)编译安装 ceres-solver

    文档地址:http://www.ceres-solver.org/installation.html git地址:(需要FQ下载) git clone https://ceres-solver.goo ...

  5. TypeScript基础学习

    什么是TypeScript? TypeScript是一种由微软开发的自由的和开源的编程语言,它是JavaScript的一个超集,扩展了JavaScript的语法. TypeScript支持任意浏览器, ...

  6. c++ primer plus 第七章 课后题答案

    #include <iostream> using namespace std; double HAR_AVG(double, double); void TEST(bool); int ...

  7. 常用的vi/vim基本命令(持续更新)

    ★删除/复制/粘贴 全部删除:按esc后,然后dG  全部复制:按esc后,然后ggyG  全选高亮显示:按esc后,然后ggvG或者ggVG   按“+p“可将系统全局粘贴板里的内容粘贴进来   y ...

  8. Codeforces 38B - Chess

    38B - Chess 思路:懂点象棋的规则就可以,看看哪些点可以放马. 代码: #include<bits/stdc++.h> using namespace std; #define ...

  9. 10X Genomics vs. PacBio

    10X Genomics已经广泛应用于单细胞测序.组装领域,现在也是火的不行. 10X Genomics原理 通过将来自相同DNA片段(10-100kb)的reads加上相同的barcode,然后在i ...

  10. Andorid 之日历控件,可左右滑动,包含公历,农历,节假日等

    公司项目需要日历这个功能,经过查阅资料写了个demo,包含公历,农历,节假日等,还可左右滑动. 效果图: 代码: public class MainActivity extends AppCompat ...