IdHTTPServer开发https服务器
该篇经验同样适用于DATASNAP和UNIGUI,因为它们都基于INDY10。
1)需要TIdServerIOHandlerSSLOpenSSL控件
2)设置属性
3)OPENSSL生成自签名证书
X.509证书包含三个文件:key,csr,crt。
- key是服务器上的私钥文件,用于对发送给客户端数据的加密,以及对从客户端接收到数据的解密
- csr是证书签名请求文件,用于提交给证书颁发机构(CA)对证书签名
- crt是由证书颁发机构(CA)签名后的证书,或者是开发者自签名的证书,包含证书持有人的信息,持有人的公钥,以及签署者的签名等信息
进OPENSSL目录 cd d:\openssl
设置配置文件 set OPENSSL_CONF=openssl.cfg
运行openssl openssl
生成服务器的私钥server.key
genrsa -des3 -out server.key 2048
用server.key生成一个证书server.csr 生成的csr 文件交给CA机构签名后,形成服务器自己的证书。按照提示,提供服务器证书的相关信息。 req -new -key server.key -out server.csr
生成客户端的私钥client.key genrsa -des3 -out client.key 2048
用client.key 生成一个证书 req -new -key client.key -out client.csr
生成服务器证书 x509 -req -days 36500 -in server.csr -signkey server.key -out server.crt
生成客户端证书 x509 -req -days 36500 -in client.csr -signkey client.key -out client.crt
证书格式转换
#IE浏览器需要p12证书,所以需要签发p12证书,用于IE签发: openssl pkcs12 -export -clcerts -in client.crt -inkeyclient.key -out client.p12 #IOS 证书签发格式 openssl x509 -in client.crt -out client.cer #Android 证书签发格式 openssl pkcs12 -export -in client.crt -inkey client.key -out client.pfx #pem格式证书 openssl pkcs12 -export -in ddmdd_a.pfx -out client.pem
4)绑定2个端口
IdHTTPServer1.Bindings.Add.Port := port; //http port IdHTTPServer1.Bindings.Add.Port := 6688; //https port
5)设置证书
IdServerIOHandlerSSLOpenSSL1.SSLOptions.KeyFile:= ExtractFilePath(ParamStr(0)) + 'yn.key'; IdServerIOHandlerSSLOpenSSL1.SSLOptions.CertFile:= ExtractFilePath(ParamStr(0)) + 'yn.crt'; IdServerIOHandlerSSLOpenSSL1.SSLOptions.RootCertFile:= ExtractFilePath(ParamStr(0)) + 'yn.crt';
6)准备ssleay32.dll和libeay32.dll文件
这2个文件,可以到DELPHI安装目录里面进行全文搜索,有。
中间件和客户端都需要这2个动态库文件。
因此INDY的SSL只支持MSWINDOWS平台,不支持LINUX、IOS、ANDROID平台。
7)增加事件处理,密码是生成yn.key文件时输入的
procedure TidHttpSvr.IdServerIOHandlerSSLOpenSSL1GetPassword(var Password: string);begin Password := '123456'; end;