IdHTTPServer開發https服務器
該篇經驗同樣適用於DATASNAP和UNIGUI,因為它們都基於INDY10。
1)需要TIdServerIOHandlerSSLOpenSSL控件
2)設置屬性
3)OPENSSL生成自簽名證書
X.509證書包含三個文件:key,csr,crt。
- key是服務器上的私鑰文件,用於對發送給客戶端數據的加密,以及對從客戶端接收到數據的解密
- csr是證書簽名請求文件,用於提交給證書頒發機構(CA)對證書簽名
- crt是由證書頒發機構(CA)簽名后的證書,或者是開發者自簽名的證書,包含證書持有人的信息,持有人的公鑰,以及簽署者的簽名等信息
進OPENSSL目錄
cd d:\openssl
cd d:\openssl
設置配置文件
set OPENSSL_CONF=openssl.cfg
set OPENSSL_CONF=openssl.cfg
運行openssl
openssl
openssl
生成服務器的私鑰server.key
genrsa -des3 -out server.key 2048
用server.key生成一個證書server.csr
生成的csr 文件交給CA機構簽名后,形成服務器自己的證書。按照提示,提供服務器證書的相關信息。
req -new -key server.key -out server.csr
生成的csr 文件交給CA機構簽名后,形成服務器自己的證書。按照提示,提供服務器證書的相關信息。
req -new -key server.key -out server.csr
生成客戶端的私鑰client.key
genrsa -des3 -out client.key 2048
genrsa -des3 -out client.key 2048
用client.key 生成一個證書
req -new -key client.key -out client.csr
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 server.csr -signkey server.key -out server.crt
生成客戶端證書
x509 -req -days 36500 -in client.csr -signkey client.key -out client.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
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;