AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Indy & OpenSSL 1.1.1 & TLS 1.3
Thema durchsuchen
Ansicht
Themen-Optionen

Indy & OpenSSL 1.1.1 & TLS 1.3

Ein Thema von mezen · begonnen am 4. Mai 2020 · letzter Beitrag vom 21. Nov 2022
Antwort Antwort
mezen

Registriert seit: 13. Jul 2011
Ort: Lippstadt
30 Beiträge
 
Delphi 10.1 Berlin Professional
 
#1

AW: Indy & OpenSSL 1.1.1 & TLS 1.3

  Alt 28. Nov 2020, 12:26
Es sollte das selbe rauskommen. Ich kann das leider erst am Dienstag in der Firma mir detaillierter anschauen. Bei meinen Tests kam damals da aber der selbe SHA1 Wert raus als wenn ich mir das Zert direkt angeschaut habe.

Bedenke aber bitte, dass das OnVerifyPeer pro Zertifikat aufgerufen wird, welches der Server zurück schickt. Sollte der Server mehrere zurückschicken (z.B. sein Server Zert plus ein Intermediate Zert), dann wird die Funktion mehrmals aufgerufen.

Wenn dir das erwartete Zertifikat aber bekannt ist, gib es besser direkt als Datei an, anstatt im OnVerifyPeer den Thumbprint zu vergleichen.
Überlass damit besser die Zertifikats Validierung komplett OpenSSL, da genug Leute sagen, dass der gefährlichste selbst geschriebene Code eine eigene Zertifikats Validierung ist.
  Mit Zitat antworten Zitat
dschiffler

Registriert seit: 25. Okt 2006
30 Beiträge
 
Delphi 12 Athens
 
#2

AW: Indy & OpenSSL 1.1.1 & TLS 1.3

  Alt 29. Nov 2020, 20:12
Hallo mezen,

danke für deine Antwort. Dann warte ich, bis du deine Überprüfung abgeschlossen hast.

Zu deinen Bemerkungen:
Das Ereignis OnVerifyPeer wird in meinem Fall nur einmal aufgerufen, denn auf dem Webserver ist definitiv nur ein Zertifikat installiert. Wie gesagt, mit Indy 10 unter Delphi 10.3.x läuft ja alles wunschgemäß. Wenn ich jetzt also lediglich den SSL-IO-Handler von Indy auf deinen wechsle und anschließend kommt eine andere Bytefolge als Fingerprint zurück, liegt ja zumindest der Verdacht nahe, dass entweder in deinen Implementierungen oder aber in den neuen SSL-Bibliotheken etwas anders als in den Indy-Komponenten und den bisherigen SSL-Bibliotheken ist.

Dein Hinweis, die Überpüfung des Zertifikats OpenSSL zu überlassen, ist interessant.
In deinen SSL-Options gibt es ja die Properties CertFile und CertKey. Laut deiner Doku dazu muss hier ein Verzeichnis angegeben werden, in dem sogenannte pem-Dateien liegen müssen.
Dazu 3 Fragen:
  • Müssen beide Properties gesetzt sein oder reicht CertFile?
  • Wo bzw. von wem bekomme ich denn diese pem-Dateien und was beinhalten diese?
  • Wie läuft denn dann die Validierung des Zertifikats ab oder besser gesagt, wie bekomme ich die Info, ob die Validierung erfolgreich war oder nicht, so dass ich darauf entspr. reagieren kann?
Liebe Grüße
Dirk Schiffler
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Indy & OpenSSL 1.1.1 & TLS 1.3

  Alt 30. Nov 2020, 04:02
Hallo,
das CertFile musst du dir meines Wissens separat vom Server holen.
Vielleicht stellt es der Server-Besitzer (also du selbst) über einen Download-Link zur Verfügung) ...
Das CetFile liegt dann also,Lokal,auf deiner Platte.
Heiko

Geändert von hoika (30. Nov 2020 um 04:40 Uhr)
  Mit Zitat antworten Zitat
mezen

Registriert seit: 13. Jul 2011
Ort: Lippstadt
30 Beiträge
 
Delphi 10.1 Berlin Professional
 
#4

AW: Indy & OpenSSL 1.1.1 & TLS 1.3

  Alt 1. Dez 2020, 10:08
So, ich hab mir das mal genauer angeguckt, wenn ich ein Cert mit dem TIdOpenSSLX509 von mir öffne (habs dafür noch ein SaveToFile und eine ctor Überladung mit einem Pfad hinzugefügt, werde das mal die Tage pushen), dann bekomme ich bei ThumbprintAsSHA1 genau das raus, was Windows einem in den Cert Details unter Thumbprint anzeigt.
Wenn das unterschiedlich zu dem alten IO Handler ist, ist dieser vllt nicht ganz korrekt gewesen?

Mein IO Handler bietet einmal FIOHandler.Options.VerifyCertificate oder alternativ FIOHandler.Options.VerifyCertDirectory. Du kannst eins von beiden, oder beide gleichzeitig nutzen. Grade beim letzteren ist OpenSSL allerdings ziemlich strict was die Benamung der Dateien angeht, da musste ich auch erst tüfteln bis ich eine funktionierende Variante heraus bekommen habe. Details stehen als XML Doc Kommentar über der Property (Der Teil mit "please look at OpenSSL documentation about "openssl verify -CApath""). Die Funktion ist perfekt darauf ausgelegt, wenn als VerifyCertDirectory ein Linux Cert Store angegeben wird.
  Mit Zitat antworten Zitat
mezen

Registriert seit: 13. Jul 2011
Ort: Lippstadt
30 Beiträge
 
Delphi 10.1 Berlin Professional
 
#5

AW: Indy & OpenSSL 1.1.1 & TLS 1.3

  Alt 1. Dez 2020, 10:17
Habs grade nochmal mit dem alten IO Handler ausprobiert: Da bekomme ich es exakt gleiche Ergebnis bei Certificate.Fingerprints.SHA1AsString raus (Ok, mein IO Handler packt keine : da rein^^).
Allerdings steht der Default von SSLOptions.VerifyDepth auf 0, daher würde er nur das Leaf-Cert prüfen und das OnVerifyPeer gar nicht mehrmals aufrufen.
Bei meinem IO Handler ist diese Option gar nicht mehr konfigurierbar und es wird der OpenSSL Standard Wert dafür genutzt (was 100 ist, siehe SSL_CTX_set_verify_depth )
  Mit Zitat antworten Zitat
dschiffler

Registriert seit: 25. Okt 2006
30 Beiträge
 
Delphi 12 Athens
 
#6

AW: Indy & OpenSSL 1.1.1 & TLS 1.3

  Alt 1. Dez 2020, 21:24
Hallo mezen,

mit der Indy-Variante (also TIdSSLIOHandlerSocketOpenSSL) bekomme ich über Certificate.Fingerprints.SHA1AsString genau den gleichen Fingerprint wie er mir angezeigt wird, wenn ich die URL bspw. im Chrome eingebe und dann über das Schloßsysmbol auf das Zertifikat zugreife und in dem Dialog auf der Seite Details mir den Fingerprint ansehe. Die Indy-Variante funktioniert also wunschgemäß und ist auch bei unseren Kunden im produktiven Einsatz.

Mit deinem IO-Handler bekomme ich über Certificate.ThumbprintAsSHA1 eine andere Bytefolge als Fingerprint angezeigt und wenn die Eingenschaft VerifyDepth bei Indy auf 0 steht und du die zur Konfiguration nicht mehr anbietest und bei dir als Standardwert 100 benutzt wird, kann dieser Unterschied ja vielleicht die Ursache sein, oder? Ich würde sehr gerne für TLS 1.3 gewappnet sein und dafür ist deine Abeit und dein IO-Handler ja super, solange Indy noch kein TLS 1.3 unterstützt, aber dann muss ich beim Einsatz deines IO-Handlers natürlich das gleiche Ergebnis bekommen, sonst kann ich ihn ja nicht einsetzen.

Ich möchte noch einmal auf meine Fragen verweisen:
  • Müssen beide Properties (CertFile und CertKey) gesetzt sein oder reicht CertFile?
  • Wie läuft denn dann die Validierung des Zertifikats ab oder besser gesagt, wie bekomme ich die Info, ob die Validierung erfolgreich war oder nicht, so dass ich darauf entspr. reagieren kann?
Ich würde gerne die pem-Datei lediglich mit unserer Software ausliefern, sie in einem Verzeichnis ablegen und dann über CertFile angeben, so dass OpenSSL seine Validierung machen kann. Funktioniert das so?
Liebe Grüße
Dirk Schiffler
  Mit Zitat antworten Zitat
dschiffler

Registriert seit: 25. Okt 2006
30 Beiträge
 
Delphi 12 Athens
 
#7

AW: Indy & OpenSSL 1.1.1 & TLS 1.3

  Alt 2. Dez 2020, 07:30
Hallo mezen,

bzgl. des Fingerprints mache ich es mal etwas konkreter:

URL im Chrome eingegeben und über das Schloßsymbol links neben der URL mir die Zertifikatseigenschaften anzign lassen.
Fingerprint: f8 41 4f 2c ...

Im Programm mit Indy (TIdSSLIOHandlerSocketOpenSSL) und den OpenSSL-Bibliotheken libeay32.dll und ssleay32.dll in der Version 1.0.2.
Certificate.Fingerprints.SHA1AsString: F8:41:4F:2C ... (also der gleiche und erwartete Fingerprint des Zertifikats)

Im Programm mit deiner Implementierung (TIdOpenSSLIOHandlerClient) und den OpenSSL-Bibliotheken libcrypto-1_1.dll und libssl-1_1.dll in der Version 1.1.1.
Certificate.ThumbprintAsSHA1: 98 C6 A8 DC ... (eine andere Bytefolge )

Vielleicht hilft dir das ja irgendwie weiter, damit wir zusammen zu einer zufriedenstellenden Lösung kommen.
Liebe Grüße
Dirk Schiffler
  Mit Zitat antworten Zitat
mezen

Registriert seit: 13. Jul 2011
Ort: Lippstadt
30 Beiträge
 
Delphi 10.1 Berlin Professional
 
#8

AW: Indy & OpenSSL 1.1.1 & TLS 1.3

  Alt 8. Dez 2020, 14:57
Sorry, kam erst jetzt wieder dazu das weiter anzuschauen.

Folgender Code jeweils mit HTTP1.Get('https://www.delphipraxis.net'); getestet.

Alter IO Handler:
Delphi-Quellcode:
function TForm1.IdSSLIOHandlerSocketOpenSSL1VerifyPeer(Certificate: TIdX509;
  AOk: Boolean; ADepth, AError: Integer): Boolean;
begin
  mmo1.Lines.Add('Depth: ' + ADepth.ToString());
  mmo1.Lines.Add('ErrorCode: ' + AError.ToString());
  mmo1.Lines.Add('Subject: ' + Certificate.Subject.OneLine);
  mmo1.Lines.Add('Thumbprint SHA1: ' + Certificate.Fingerprints.SHA1AsString);
  mmo1.Lines.Add('');
  Result := True;
end;
Code:
Depth: 0
ErrorCode: 20
Subject: /CN=*.delphipraxis.net
Thumbprint SHA1: 70:B1:AC:83:99:05:36:27:75:AE:7E:ED:92:5E:0F:A8:A0:0B:D0:52

Depth: 0
ErrorCode: 21
Subject: /CN=*.delphipraxis.net
Thumbprint SHA1: 70:B1:AC:83:99:05:36:27:75:AE:7E:ED:92:5E:0F:A8:A0:0B:D0:52
Neuer IO Handler:
Delphi-Quellcode:
procedure TForm1.HandleOnVerify(Sender: TObject; const x509: TIdOpenSSLX509;
  const VerifyResult, Depth: Integer; var Accepted: Boolean);
begin
  mmo1.Lines.Add('Depth: ' + Depth.ToString());
  mmo1.Lines.Add('ErrorCode: ' + VerifyResult.ToString());
  mmo1.Lines.Add('Subject: ' + x509.Subject.AsString);
  mmo1.Lines.Add('Thumbprint SHA1: ' + x509.ThumbprintAsSHA1);
  mmo1.Lines.Add('');
  Accepted := True;
end;
Code:
Depth: 2
ErrorCode: 19
Subject: /C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert Global Root G2
Thumbprint SHA1: DF3C24F9BFD666761B268073FE06D1CC8D4F82A4

Depth: 2
ErrorCode: 19
Subject: /C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert Global Root G2
Thumbprint SHA1: DF3C24F9BFD666761B268073FE06D1CC8D4F82A4

Depth: 1
ErrorCode: 19
Subject: /C=US/O=DigiCert Inc/OU=www.digicert.com/CN=Thawte TLS RSA CA G1
Thumbprint SHA1: C9FEFC763D9548B487696F047ACBA0ABE45C7BC1

Depth: 0
ErrorCode: 19
Subject: /CN=*.delphipraxis.net
Thumbprint SHA1: 70B1AC839905362775AE7EED925E0FA8A00BD052
Wie du siehst ist bei Depth 0 der SHA1 Thumbprint identisch.
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:53 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz