Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Indy 9: Zugriffsverletzung bei SSL-Zertifikatsprüfung (https://www.delphipraxis.net/168040-indy-9-zugriffsverletzung-bei-ssl-zertifikatspruefung.html)

Codehunter 2. Mai 2012 07:55

Indy 9: Zugriffsverletzung bei SSL-Zertifikatsprüfung
 
Hallo,

ich hab da ein kleines Problem. Eins vorweg: Ich verwende Indy 9 da der Protierungsaufwand bei einigen großen Projekten nicht machbar ist derzeit. Leider siehts mit der Parallelinstallation beider Indys auch nicht so rosig aus, darum bleibt es vorerst bei der 9er Version.

Auf der Serverseite habe ich einen Apache laufen, mod_ssl usw. ist alles schick konfiguriert und ein VHost eingerichtet, welcher nur auf Port 443 lauscht und nur SSL-Verbindungen annimmt. Zweitens habe ich auf dem Server mit dem aktuellen OpenSSL ein Zertifikat für die Subdomain/VHost erzeugt. Rufe ich die Subdomain im Browser auf, läuft das normale Procedere, d.h. Browser beklagt sich über den unbekannten Zertifikatsaussteller, danach steht die SSL-Verbindung. Browser-SSL-Info sagt "TLS v1.0 256 bit AES (1024 bit DHE_RSA/SHA)" wird verwendet. Soweit so gut.

Jetzt habe ich mit Delphi (7 Pro) ein kleines Testprojekt erstellt. Einen IdHTTP und einen IdSSLIOHandlerSocket aufs Formular, IdHTTP1.IOHandler auf IdSSLIOHandlerSocket1 eingestellt und IdSSLIOHandlerSocket1.OnVerifyPeer zugewiesen.

Die SSL-DLLs habe ich von http://indy.fulgan.com/SSL/ runtergeladen und ins Projekt-EXE-Verzeichnis gelegt.

Die folgende Routine ruft dann das Test-Dokument vom Server ab:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  IdSSLOpenSSLHeaders.Load;
  with HTTPs do begin
    Host:= 'subdomain.intranet.local';
    Port:= 443;
    if Connected then Disconnect;
    Connect;
    Memo1.Lines.Add(Get('https://subdomain.intranet.local/index.html'));
    Disconnect;
  end;
end;
Klappt soweit auch, HTML-Seite wird abgerufen und im Memo angezeigt. Jetzt kommt der Schlamassel: Setze ich IdSSLIOHandlerSocket1.SSLOptions.VerifyMode:= [sslvrfPeer] (oder irgendeine andere Kombination anstatt IdSSLIOHandlerSocket1.SSLOptions.VerifyMode:= []), dann knallt es jedesmal mit einer Access Violation. Setze ich IdSSLIOHandlerSocket1.SSLOptions.Method:= sslvTLSv1, dann kommt zusätzlich noch eine EIdOSSLConnectionError Exception. OnVerify wird nicht ausgelöst. Testweise habe ich OnVerify so gestaltet:
Delphi-Quellcode:
function TForm1.SSLVerifyPeer(Certificate: TIdX509): Boolean;
begin
  with Certificate do begin
    Memo1.Lines.Add(FingerprintAsString);
  end;
end;
Wenn OnVerify nicht funktioniert, dann kann ich den nächsten Schritt nicht gehen, das Zertifikat zu prüfen. Damit wäre der ganze SSL-Aufwand nutzlos, ich könnte genauso gut ungesicherte Verbindungen nutzen.

Sind es mal wieder inkompatible SSL-DLLs? Zumindest die Verbindung und der Abruf als solches funktionieren ja, nur das Prüfen des Zertifikates nicht :-(

Grüße
Cody

EDIT: Ich bin schon mal einen Schritt weiter: Wenn ich in der o.g. ButtonClick-Routine unmittelbar nach dem ersten Connect ein Memo1.Lines.Add(SSL.SSLSocket.PeerCert.Fingerprint AsString) ausführe, dann bekomme ich die Daten des Serverzertifikates. Scheinbar knallt es nur bei den Eventhandlern. Bug in Indy 9 oder BimB (Bug in my Brain)??? ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:50 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