Hallo,
nachdem ich mit Microsofts XMLHTTPRequester auf die Nase gefallen bin, versuch ich nun folgende Aufgabe mit
Indy zu lösen:
Es geht also um ein HTTPRequest mit SSL und Zertifikaten auf Server- und Clientseite. Das Ganze muss dann auch noch über Proxys funktionieren.
Nach stundenlangem Lesen im Internet bin ich mir ziemlich sicher, dass
Indy (10.5.5) dass auch kann; nur weiß ich noch nicht genau wie.
1. Das Client-Zertifikat ist korrekt installiert. In den
Indy-SSLOptionen werden RootCertFile, Certfile und KeyFile angegeben. Drei Dateien scheinen mir eine zuviel zu sein. Ein weiteres Problem stellt die Tatsache dar, dass das Zertifikat ein Exportieren des privaten Schlüssels nicht zulässt (oder brauch ich den auch garnicht?).
2. Was hat es mit VerifyMode und VerifyPeer auf sich?
3. Meine bisherigen Erkenntnisse sehen wie folgt aus. Habe ich irgendetwas übersehen? (Übrigens habe ich noch ein unlösbares Problem: ich habe selber keinen Zugang zum Server und kann das Programm nur beim Kunden testen...)
Ich freue mich auf Eure Hinweise
!
Delphi-Quellcode:
List:=TStringList.Create;
List.Add('
Dummy');
IdHTTP:=TIdHTTP.Create(
nil);
IdHTTP.Request.ContentType:='
text/xml';
IdHTTP.Request.CharSet:='
utf-8';
IdHTTP.Request.UserAgent:='
Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)';
IdHTTP.Request.AcceptEncoding:='
gzip, deflate';
FIdSSLIOHandlerSocketOpenSSL:=TIdSSLIOHandlerSocketOpenSSL.Create(
nil);
FIdSSLIOHandlerSocketOpenSSL.SSLOptions.RootCertFile:=
FIdSSLIOHandlerSocketOpenSSL.SSLOptions.CertFile:=
FIdSSLIOHandlerSocketOpenSSL.SSLOptions.KeyFile:=
FIdSSLIOHandlerSocketOpenSSL.SSLOptions.Method:=sslvSSLv3;
FIdSSLIOHandlerSocketOpenSSL.SSLOptions.Mode:=sslmClient;
FIdSSLIOHandlerSocketOpenSSL.SSLOptions.VerifyMode:=
FIdSSLIOHandlerSocketOpenSSL.SSLOptions.VerifyDepth:=
FIdSSLIOHandlerSocketOpenSSL:=TIdSSLIOHandlerSocketOpenSSL.Create(
nil);
FIdSocksInfo:=TIdSocksInfo.Create(
nil);
with FIdSocksInfo
do
begin
Host:=aProxy;
// 192.168.124.20
Port:=aPort;
// 8080
Version:=svSocks5;
Username:='
';
Password:='
';
Enabled:=True;
end;
FIdSSLIOHandlerSocketOpenSSL.TransparentProxy:=FIdSocksInfo;
IdHTTP.IOHandler:=FIdSSLIOHandlerSocketOpenSSL;
try
ResponseStr:=IdHTTP.Post(aURL, List);
except
ShowMessage('
Fehler');
end;
List.Free;
IdHTTP.Free;