Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   HTTPRequest mit Indy und Zertifikaten (https://www.delphipraxis.net/169295-httprequest-mit-indy-und-zertifikaten.html)

EmWieMichael 10. Jul 2012 12:51

HTTPRequest mit Indy und Zertifikaten
 
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;

mjustin 11. Jul 2012 19:05

AW: HTTPRequest mit Indy und Zertifikaten
 
Funktioniert es denn in einer Testumgebung (Delphi Client + Delphi Server)?
Das wäre zwar nicht eine Garantie, dass es auch auf dem Zielsystem funktioniert, aber man könnte die bereits bekannten Einstellungen schon einmal verifizieren.
Zunächst ohne Proxy, das ist ein Kapitel für sich (z.B. verwendet der Proxy keinerlei Anmeldeverfahren?)

EmWieMichael 12. Jul 2012 10:03

AW: HTTPRequest mit Indy und Zertifikaten
 
Zitat:

Zitat von mjustin (Beitrag 1174360)
Funktioniert es denn in einer Testumgebung (Delphi Client + Delphi Server)?
Das wäre zwar nicht eine Garantie, dass es auch auf dem Zielsystem funktioniert, aber man könnte die bereits bekannten Einstellungen schon einmal verifizieren.
Zunächst ohne Proxy, das ist ein Kapitel für sich (z.B. verwendet der Proxy keinerlei Anmeldeverfahren?)

Vielen Dank für Dein Posting!
Eine entsprechende Testumgebung wäre zwar nicht schlecht, aber da mir die Zeit im Nacken sitzt, muss ich auf die Einrichtung eines Servers erstmal verzichten und betrachte das Zielsystem als Testsystem...:shock:
Irgendwie schade mit den Indy-Komponenten: Im Internet finden sich Fragen über Fragen, z. B. zum Thema HTTP-Request mit Zertifikaten, aber kaum brauchbare Antworten. Ich konnte bisher nicht einmal herausfinden, warum die Angaben des Proxys in FIdSocksInfo und nicht in IdHTTP.ProxyParams gemacht werden (ich habe den Code auch nur aus gefundenen Beispielen zusammengefrickelt).

Gruß Michael.

CCRDude 12. Jul 2012 10:47

AW: HTTPRequest mit Indy und Zertifikaten
 
Gerade wenn einem die Zeit im Nacken sitzt, sollte man mal tief durchatmen und strukturiert testbaren Code schreiben statt mit nicht debugbaren Gegenstelle einen deutlich schwerer einschätzbaren Zeitaufwand zu riskieren. Und nach testen in der Entwicklungsumgebung ist man besser auf die möglichen Situationen beim Anpassen beim Kunden eingestellt.

Ist natürlich immer leichter gesagt als getan, aber hat die Erfahrung eigentlich immer wieder bewiesen ;)

Zum Thema selbst kann ich leider nichts sagen, außer zu dem "zuviel" - wenn das Zertifikat selbstsigniert (und nicht zentral installiert) ist, dürfte das Root als Drittes notwendig sein.

mjustin 12. Jul 2012 17:27

AW: HTTPRequest mit Indy und Zertifikaten
 
Zitat:

Zitat von EmWieMichael (Beitrag 1174416)
und betrachte das Zielsystem als Testsystem...

Das ist halbwegs ok wenn das System ständig verfügbar ist, zum Beispiel im eigenen Intranet, wo man dann auch das Clientprogramm in der IDE zeilenweise ausführen / debuggen kann. Und auch ein jederzeit ansprechbarer Administrator bereitsteht, um Fragen zu beantworten oder auf Logfiles des Servers zuzugreifen.

Einen eventuell hilfreichen Client- und Server-SSL-Zertifikatscode für Indy habe ich in diesem Beitrag gefunden:

http://www.delphipraxis.net/138951-i...gsproblem.html

Das Archiv enthält aber nicht alle Zertifikate, die sollte man natürlich auch selber erstellen können.

Drei Zertifikatsdateien scheinen normal zu sein - CA, Server-Zertifikat und Key habe ich auch anderweitig (nicht Indy-bezogen) schon für einen im SSL Modus betriebenenn Server erzeugen und hinterlegen müssen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:16 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz