用基于 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,下载官方补丁可以解决。