求助delphi实现ssl验证客户端证书
最近在用delphi实现CS模式下的SSL通信开发。
项目使用weblogic架设ssl,即生成jks文件在weblogic上配置加载,可成功启动ssl。
但weblogic要求必须配置为验证客户端证书,此种情况下,客户端不提交证书是不能访问任何服务器资源的。
这个证书存在于客户的usbkey中,将usb插入电脑,使用浏览器访问https的资源,浏览器会自动提示选择证书(是IE6时,使用ie8时只要求输入pin码),之后浏览器自动完成提交证书操作。
这里由于项目的客户端使用的是delphi,并且交互接口是通过webservice实现的,也就是说要实现带ssl的webservice。
这里使用indy10完成,主要代码如下。
function TForm1.getHTTPRIO(): TIdHTTPRIO;
var
SoapClient: TIdHTTPRIO;
SSLRequired: Boolean;
begin
SSLRequired := True;
SoapClient:= TIdHTTPRIO.Create(nil);
with SoapClient.HTTPWebNode.HttpClient do
begin
SoapClient.WSDLLocation := 'e:\MyProgram\Delphi\Demos\SSL_HTTPRio\demo\interface.wsdl';
SoapClient.Service := 'ServiceInterfaceImplService';
SoapClient.Port := 'ServiceInterface';
AllowCookies:= True;
HandleRedirects:= False;
ProtocolVersion:= pv1_1;
// {$IFNDEF INDY10}
// MaxLineLength:= 16384;
// RecvBufferSize:= 32768;
// {$ENDIF}
if not SSLRequired then
begin // HTTP
{$IFDEF INDY10}
CreateIOHandler(nil);
{$ELSE}
IOHandler.Free;
IOHandler:= nil;
{$ENDIF}
end
else
begin // HTTPS
{$IFDEF INDY10}
IOHandler:= TIdSSLIOHandlerSocketOpenSSL.Create(
SoapClient.HTTPWebNode.HttpClient);
{$ELSE}
IOHandler:= TIdSSLIOHandlerSocket.Create(SoapClient.HTTPWebNode.HttpClient);
{$ENDIF}
with
{$IFDEF INDY10}
TIdSSLIOHandlerSocketOpenSSL
{$ELSE}
TIdSSLIOHandlerSocket
{$ENDIF}
(IOHandler), SSLOptions do
begin
Method := sslvSSLv23; // select SSL method
// 3个文件!
CertFile := 'd:\bea\ca\temp\cert1.pem'; // 'my.crt'; // assign certificate
KeyFile := 'e:\WorkDoc\ngg\CA\CA\myCA\key.pem'; // 'my.key'; // assign private key
RootCertFile := 'd:\bea\ca\temp\cert2.pem'; // 'root.crt';
// 证书密码
OnGetPassword := GetPassword;
Mode := sslmClient;
// 验证深度
VerifyDepth := 2;
VerifyMode := [sslvrfPeer, sslvrfFailIfNoPeerCert, sslvrfClientOnce];
OnStatusInfo := DoOnStatusInfo;
OnVerifyPeer:= DoOnVerifyPeer;
end;
end;
end;
// end;
SoapClient.HTTPWebNode.OnLog:= SoapClientOnLog; // custom logging
// set correct ReadTimeout
TIdTCPClient(SoapClient.HTTPWebNode.HttpClient).OnConnected:= HttpClientOnConnected;
Result := SoapClient;
end;
上述代码已经可成功与服务器交互。
上面的3个文件是从weblogic发布ssl使用的jsk文件中转换出来,没有使用usbkey中的证书,这样等于没有用上usbkey。
如何使用usbkey的证书和密钥,是我没弄明白的问题。‘
usbkey插入电脑后,会自动将证书注册到系统证书区,可以查看到证书,可以将证书导出,但导出的格式可用的只有3种,base64,der,pkcs7。其中都是只有证书没有密钥的。可以包含密钥的pfx格式在导出界面为灰色无法选择。
那么我如何得到usbkey中证书的密钥文件,从而复制给indy呢?
另外indy这个组件要求必须有证书文件,这个策略是不是也不够安全,目前不知道有什么其他更好用的 可以在delphi下实现ssl的组件,如果有人知道请告知。
总结一下,一句话说这个问题就是delphi下实现验证客户端证书的ssl通信,请做过这种项目的高手告知,不胜感谢,嗷嗷感谢,不胜嗷嗷的感谢啊!!!!!!!!