posts - 235,  comments - 527,  trackbacks - 0

在以前的文章里面介绍过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 了

 

 

好了,就这么多了。

posted on 2014-07-18 16:35 xalion 阅读(...) 评论(...) 编辑 收藏