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 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
mezen

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

AW: Indy & OpenSSL 1.1.1 & TLS 1.3

  Alt 8. Dez 2020, 15:01
Und so sieht es aus, wenn man beim alten IO Handler mal das VerifyDepth hoch dreht:
Code:
Depth: 2
ErrorCode: 19
Subject: /C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert Global Root G2
Thumbprint SHA1: DF:3C:24:F9:BF:D6:66:76:1B:26:80:73:FE:06:D1:CC:8D:4F:82:A4

Depth: 2
ErrorCode: 19
Subject: /C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert Global Root G2
Thumbprint SHA1: DF:3C:24:F9:BF:D6:66:76:1B:26:80:73:FE:06:D1:CC:8D:4F:82:A4

Depth: 1
ErrorCode: 19
Subject: /C=US/O=DigiCert Inc/OU=www.digicert.com/CN=Thawte TLS RSA CA G1
Thumbprint SHA1: C9:FE:FC:76:3D:95:48:B4:87:69:6F:04:7A:CB:A0:AB:E4:5C:7B:C1

Depth: 0
ErrorCode: 19
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
  Mit Zitat antworten Zitat
dschiffler

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

AW: Indy & OpenSSL 1.1.1 & TLS 1.3

  Alt 12. Dez 2020, 17:14
Hallo mezen,

ich habe deinen Test so bei mir mit meiner URL nachvollzogen und komme zu dem gleichen Ergebnis.
Der erwartete Fingerprint wird bei Depth = 0 zurückgegeben.
Somit können wir erst einmal feststellen, dass dein IO-Handler funktioniert.

Ich habe dann offensichtlich im Verify-Ereignis etwas falsch gemacht und werde das jetzt analysieren. Dabei ist dein Hinweis, dass das Verify-Ereignis durchaus mehrmals ausgelöst werden kann, sehr hilfeich. Sollte ich bei dieser Überprüfungsvariante bleiben, darf ich also den Fingerprint erst bei Depth = 0 auswerten und überprüfen.

Ich bedanke mich schon einmal recht herzlich für deine Hilfe.

Kannst du mir zum Abschluss bitte noch ein Code-Beispiel geben, wie ich deinen Vorschlag, die Zertifikatsüberprüfung OpenSSL zu überlassen, umsetzen kann und die Nutzung von CertFile richtig gemacht wird?
Liebe Grüße
Dirk Schiffler
  Mit Zitat antworten Zitat
THonscha

Registriert seit: 22. Aug 2006
36 Beiträge
 
#4

AW: Indy & OpenSSL 1.1.1 & TLS 1.3

  Alt 6. Mär 2021, 15:26
Weiß jemand, ob die neuen TLS Versionen auf Delphi 10.4.2 unterstützt werden?
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.055 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#5

AW: Indy & OpenSSL 1.1.1 & TLS 1.3

  Alt 6. Mär 2021, 16:15
Nicht von Indy, von Komponenten wie TRestClient, der nicht auf Indy basiert schon.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
AWeber

Registriert seit: 12. Feb 2013
19 Beiträge
 
#6

AW: Indy & OpenSSL 1.1.1 & TLS 1.3

  Alt 25. Aug 2021, 12:32
Hallo,
zunächst möchte ich mich bedanken für die hier geleistete Arbeit

Aber auch gleich mit einem kleinen Problem um die Ecke kommen. Die Reaktion denn die OpenSSL DLL's nicht vorhanden sind - ist nicht so schön bei mir kommt es dann immer zu einer Schutzverletzung - im destructor der Klasse TIdOpenSSLContextClient Soweit ich durchdebuggt habe - ist die Aufrufkette folgende:
Delphi-Quellcode:
TIdTCPClientCustom.Connect( ) --> IOHandler := nil; (bedingt durch Exception) --> TIdTCPConnection.SetIOHandler --> IdDisposeAndNil(LIOHandler);
--> TIdOpenSSLIOHandlerClient.Destroy --> TIdOpenSSLContextClient.Destroy
Delphi-Quellcode:
TIdTCPClientCustom.Connect( )
  try
    IOHandler.Open; --> Exception weil DLL's nicht verfügbar
except
if IOHandler <> nil then begin
IOHandler.Close;
if ManagedIOHandler then begin
// Mein IOHandler ist ManagedIOHandler = true! (bedingt durch anderen Code zuvor)
IOHandler := nil; // RLebeau - SetIOHandler() will free the IOHandler
end;
end;
raise;
end;
Das Set IOhandler = nil führt dann zu:

Delphi-Quellcode:
 procedure TIdTCPConnection.SetIOHandler(AValue: TIdIOHandler);
    if ManagedIOHandler then begin
      if Assigned(LIOHandler) then begin
        FIOHandler := nil;
        -- Zugriffsfehler im Destructor des IOHandlers
        IdDisposeAndNil(LIOHandler);
      end;
      ManagedIOHandler := False;
    end;
Delphi-Quellcode:
destructor TIdOpenSSLIOHandlerClient.Destroy;
  FContext.Free(); --> Zugriffsfehler
Delphi-Quellcode:
destructor TIdOpenSSLContextClient.Destroy;
  OpenSSLContext ist hier noch nil
  und die Methoden / Funktionszeiger
  -> SSL_CTX_sess_set_remove_cb
  -> SSL_CTX_sess_set_new_cb ebenso... da DLL ja nicht gefunden wurde
Meine Lösung sieht jetzt so aus ich ändere die Routine:

Delphi-Quellcode:
procedure TIdOpenSSLIOHandlerClient.EnsureContext;
begin
  // schlägt das Laden der DLL fehl ist FContext noch <nil> und der Aufruf des TIdOpenSSLContextClient.Destroy entfällt.
  EnsureOpenSSLLoaded();

  if not Assigned(FContext) then
     FContext := TIdOpenSSLContextClient.Create();
  
  // EnsureOpenSSLLoaded(); --> führt ggf. zu Exception, wo FContext welches nicht komplett initialsiert ist abgeräumt wird
  try
    BeforeInitContext(FContext);
    TIdOpenSSLContextClient(FContext).Init(FOptions);
    AfterInitContext(FContext);
  except
    on E: EExternalException do
    begin
      try
        FreeAndNil(FContext);
      except
        on E: EExternalException do ; // Nothing
      end;
      raise EIdOpenSSLLoadError.Create('Failed to load OpenSSL');
    end;
  end;
end;
ist das so der richtige Weg?

Nachtrag:

in der Funktion TOpenSSLLoader.Load steckt leider auch ein Bug, auch wenn diese Funktion beim ersten Versuch sauber false liefert wenn die DLL's nicht geladen werden konnten, liefert einer 2. Aufruf true - auch wenn die DLL's immer noch nicht da sind... daher habe ich folgende geändert:

if not Result then
begin
// bei weiterem Aufruf nochmal versuchen die DLL's zu laden...
FLoadCount.Decrement();
Exit;
end;




André

Geändert von AWeber (25. Aug 2021 um 13:02 Uhr)
  Mit Zitat antworten Zitat
THonscha

Registriert seit: 22. Aug 2006
36 Beiträge
 
#7

AW: Indy & OpenSSL 1.1.1 & TLS 1.3

  Alt 21. Dez 2021, 08:07
Hat sich bei Indy etwas mit dem TLS 1.3 Support getan? Gibt es eine Delphi Version, die das out of the box unterstützt?
  Mit Zitat antworten Zitat
Thomasl

Registriert seit: 19. Jun 2006
Ort: Vreden
71 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Indy & OpenSSL 1.1.1 & TLS 1.3

  Alt 3. Aug 2022, 08:26
Ich habe es auch ans laufen bekommen.
Eine Frage, die IdOpenSSLConsts.pas kann man die wie hier auf die 3er DLL´s umbenennen?
Oder gibt es da noch Probleme.
Muss SSLDLLVers auch angepasst werden?
Es Funktioniert so wie hier

Delphi-Quellcode:
unit IdOpenSSLConsts;

interface

{$i IdCompilerDefines.inc}

const
  CLibCryptoRaw = 'libcrypto';
  CLibSSLRaw = 'libssl';

  SSLDLLVers: array [0..1] of string = ('', '.1.1');

  CLibCrypto =
 // {$IFDEF CPU32}CLibCryptoRaw + '-1_1.dll'{$ENDIF}
 // {$IFDEF CPU64}CLibCryptoRaw + '-1_1-x64.dll'{$ENDIF}
    {$IFDEF CPU32}CLibCryptoRaw + '-3.dll'{$ENDIF}
    {$IFDEF CPU64}CLibCryptoRaw + '-3-x64.dll'{$ENDIF}
    ;
  CLibSSL =
// {$IFDEF CPU32}CLibSSLRaw + '-1_1.dll'{$ENDIF}
// {$IFDEF CPU64}CLibSSLRaw + '-1_1-x64.dll'{$ENDIF}
    {$IFDEF CPU32}CLibSSLRaw + '-3.dll'{$ENDIF}
    {$IFDEF CPU64}CLibSSLRaw + '-3-x64.dll'{$ENDIF}
    ;

implementation

end.
Thomas Levering
  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 21:11 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