红鱼儿

REST easy with kbmMW #3 – SSL

我在前两篇文章中展示了“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[0].Port:=443;
 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安全地为客户端提供服务了!

 

posted on 2018-07-19 22:04  红鱼儿  阅读(300)  评论(0编辑  收藏  举报