Delphi 开发的基于 Indy 的 WebBroker 或者 WebService 服务器支持 https

用基于 Indy HTTPServer 的内置 Web 服务器的独立运行模式,基于 WebBroker 架构,开发简单的 WebServer 应用,如果访问量不大,是非常简单轻松调试方便的模式。

开发 WebService 服务器端,也同样可以采用 Stand-alone 模式,一个独立运行的 EXE 程序,内置了一个 Web 服务器,无需 IIS 或者其它 WEB 服务器就能独立工作。

上述两种,都是内置基于 Indy 控件的 Web 服务器。

如果要让上述两种服务器都支持 https 的访问(加密访问,其网络流量被加密),则需要使用 OpenSSL 的支持。

Indy 对 OpenSSL 的使用如下:

1. 网上下载两个 OpenSSL 的 DLL 动态库:libeay32.dll 和 ssleay32.dll;

1.1. 上述两个文件,放到运行时的 EXE 文件的目录底下。程序会自动加载;

2. EXE 程序目录底下(或其它目录也可以),放上三个证书文件:

2.1. myhost.com.cert.pem 这个是网站证书文件;

2.2. myhost.com.key.pem 这个是网站证书对应的私钥文件;

2.3. ca.cert.pem 这个是根证书文件;

3. 拖一个 IdServerIOHandlerSSLOpenSSL1 到界面上;

4. 写一个加载证书文件的函数:

procedure TForm1.LoadPem;
begin
  //加载证书
  IdServerIOHandlerSSLOpenSSL1.SSLOptions.CertFile := TPath.Combine(Self.GetMyPath, 'mis.myhost.net.cert.pem');    //   'c:\dev\keys\localhost.cert.pem';
  IdServerIOHandlerSSLOpenSSL1.SSLOptions.KeyFile := TPath.Combine(Self.GetMyPath, 'mis.myhost.net.key.pem');       // 'c:\dev\keys\localhost.key.pem';
  IdServerIOHandlerSSLOpenSSL1.SSLOptions.RootCertFile := TPath.Combine(Self.GetMyPath, 'ca.cert.pem');   // 'C:\dev\keys\ca.cert.pem';
  IdServerIOHandlerSSLOpenSSL1.SSLOptions.Mode := sslmServer;
  IdServerIOHandlerSSLOpenSSL1.SSLOptions.VerifyMode := [];
  IdServerIOHandlerSSLOpenSSL1.SSLOptions.VerifyDepth  := 0;
  IdServerIOHandlerSSLOpenSSL1.SSLOptions.SSLVersions := [sslvTLSv1_2];    // Avoid using SSL
  //IdServerIOHandlerSSLOpenSSL1.OnGetPassword := GetPassword;
end;

5. 在服务器程序激活 WEB Server 之前调用上述函数:

var FServer: TIdHTTPWebBrokerBridge;

procedure TForm1.StartServer;
begin
  if not FServer.Active then
  begin
    FServer.Bindings.Clear;
    FServer.DefaultPort := StrToInt(EditPort.Text);
    Self.LoadPem;
    FServer.IOHandler := IdServerIOHandlerSSLOpenSSL1;
    FServer.Active := True;
  end;
end;

6. 到这里,服务器端的相关代码搞定。这里我让服务器运行在 8080 端口;

----------------

客户端:

1. 系统导入证书:把发布的根证书安装到 WINDOWS 系统里面。运行: cermgr.msc 在弹出来的窗口(窗口标题:【管理计算机证书】)里面选择【受信任的根证书颁发机构】,右键下拉菜单,选择【导入】;

1.1. 弹出来文件选择框,选择自己创建的 ca.cert.pem 文件(Windows 默认不支持 pem 文件,需要在文件对话框选择“所有文件”);

1.2. 一路向下走,导入成功。

1.3. 参考:https://blog.csdn.net/qq_15017407/article/details/53634878

2. 这时候可以用浏览器访问:https://localhost:8080,成功。

2.1. 浏览器可能会提示证书不可信,手动选择继续访问就可以了。

3. WebService 的客户端,只需要设置 HTTPRIO1.URL := https://localhost:8080/soap 也就可以了。也就是直接将原本的 http 访问变成了 https 的加密访问。

----------------------------

使用 Indy HTTP Server 的好处是可以自己用 OpenSSL 签发根证书,无需去购买证书。公司内部使用是完全没有问题的。如果应用是针对普通公众的,自己签发的根证书因为不被公众的浏览器信任,无法使用。

-----------------------------

备注,BUG:

我的开发环境:Delphi 10.3.3 社区版。Indy TCP Server 加载 SSL 会出现无法加载根证书文件的异常。这个是 Delphi 的 BUG,下载官方补丁可以解决。

猜你喜欢

转载自blog.csdn.net/pcplayer/article/details/108475074
今日推荐