在以前的文章里面介绍过kbmmw 做web server.
前几天红鱼儿非要我给他做一个支持https 的web server.
其实kbmmw 支持https 有好几种方法:
1. 使用isapi 部署到iis 或者是apache 上,使用iis 或apache 的https 功能;
2.通过代理方式,使用使用iis 或apache 的https 功能。
今天通过kbmmw 的原生indy 方式实现一下https 支持。
由于是测试,不可能使用真正的证书服务。要应用到商业使用,要申请商用证书。
这里只是说明实现方式。
首先我们利用我们以前的web server 程序。
这服务器上加一个TkbmMWTCPIPIndyServerTransport,改名为sslt, 设置绑定端口443, 同时streamformat
设为AJAX.
并设置事件:
procedure TForm1.ssltConnect(AContext: TIdContext); begin if AContext.Connection.IOHandler is TIdSSLIOHandlerSocketBase then TIdSSLIOHandlerSocketBase(AContext.Connection.IOHandler).PassThrough:=false; end;
再放一个TIdServerIOHandlerSSLOpenSSL ,设置必要的参数如图;
注意,在单元引用里面要加入 IdContext 。
现在应该可以编译通过,但是ssl 还没有起作用。
现在需要为ssl 生成相关的key 与证书文件。
由于indy 是用openssl 实现证书的。我们先要下载一个openssl.
没有Linux ,就直接使用官网上的windows 版。
在这里下载http://www.openssl.org/related/binaries.html
我下载的文件名为Win32OpenSSL-1_0_1h.exe。
安装到系统上,运行就会出现黑窗口。
输入命令 genrsa -des3 -out kbmmw.key 1024
屏幕让输入key 的密码,随便输一个字符串。这里是xalion.要输两次,保持一致就可以了。
现在生成了key 文件,继续努力,生成证书文件。
把openssl 目录里面的openssl.cfg 拷贝一份,命名为openssl.cnf.
还是命令行:
req -new -x509 -days 365 -key kbmmw.key -out kbmmw.crt -config openssl.cnf
输入密码,然后填入相应的国家、组织、名字、邮件等信息。
填完后,就生成了证书。
把这两个文件放到一个固定的目录。
例如d:\crt.
回到前面我们的delphi 程序。
开始设置相关的属性。
并加入事件。
procedure TForm1.sslGetPassword(var Password: string); begin Password:='xalion'; end;
最后要把ssl 处理挂接到sslt 对象上。
在服务器激活前,加入下面代码:
sslt.IdTCPServer.IOHandler:=ssl;
如图
ok, 所有的东西都设置完了,准备发射。
编译运行,启动服务器。
注意,你的机器上一定要把开着443 端口的程序关掉。例如vmware.
在浏览器里面输入https://127.0.0.1.
第一次会出现
说明这个证书是假的,同时说明我们的系统工作正常了。
确认这个例外。
就可以通过https 正常访问web 了
好了,就这么多了。