![]() |
AW: Indy & OpenSSL 1.1.1 & TLS 1.3
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
Delphi-Quellcode:
Soweit ich durchdebuggt habe - ist die Aufrufkette folgende:
TIdOpenSSLContextClient
Delphi-Quellcode:
TIdTCPClientCustom.Connect( ) --> IOHandler := nil; (bedingt durch Exception) --> TIdTCPConnection.SetIOHandler --> IdDisposeAndNil(LIOHandler);
--> TIdOpenSSLIOHandlerClient.Destroy --> TIdOpenSSLContextClient.Destroy
Delphi-Quellcode:
Das Set IOhandler = nil führt dann zu:
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;
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:
Meine Lösung sieht jetzt so aus ich ändere die Routine:
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
Delphi-Quellcode:
ist das so der richtige Weg?
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; 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é |
AW: Indy & OpenSSL 1.1.1 & TLS 1.3
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?
|
AW: Indy & OpenSSL 1.1.1 & TLS 1.3
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. |
AW: Indy & OpenSSL 1.1.1 & TLS 1.3
@mezen, liest du hier noch mit? Ich verwende seit einiger Zeit deinen neuen Openssl IOHandler und bin recht zufrieden damit. Jetzt bin ich an einem Punkt wo ich Mails mit S/MIME signieren und verschlüsseln möchte. Die notwendigen Funktionen dazu gibt es ja in dem Openssl Dlls. Ich würde dazu gerne die restlichen Importe ergänzen, für einige der Funktionen kommt dieses Stack genannte Konstrukt zum Einsatz, damit nicht alles mit mehr oder minder typlosen pointern machen muss habe ich den Codegenerator erweitert, so dass er auch die Stack_of defines in Delphi inline Funktionen umsetzt.
Das würde ich gerne mit der Gemeinschaft teilen, wie lautet die URL / Branch deines github repositories? Ich würde davon einen Branch machen und meinen Änderungen dort einstellen, ggf. kannst du das ja mergen? |
AW: Indy & OpenSSL 1.1.1 & TLS 1.3
Zitat:
![]() oder dieser: ![]() |
AW: Indy & OpenSSL 1.1.1 & TLS 1.3
Hallo zusammen,
ich breche mir seit Tagen die Finger, um folgende Anforderung umsetzen zu können: Wir haben einen Rest-Webservice laufen, der mit Indy entwickelt wurde. Diesen WS ruft unser SAP auf, um uns Daten (IDOC) zu übermitteln. Aus Sicherheitsgründen soll nun auf der SAP-Seite "EMS" (Extended Master Secret) verwendet werden. AFAIK funktioniert das nur mit OpenSSL 1.1.1. Die Binaries dafür habe ich, aber ich stehe irgendwie komplett auf dem Schlauch, was ich jetzt für Indy 10 unter 10.1 Berlin alles herunterladen, patchen usw. muss. Kann mir da jemand Schritt für Schritt auf die Sprünge helfen? Tausend Dank im Voraus! |
AW: Indy & OpenSSL 1.1.1 & TLS 1.3
Zitat:
Eventuell hilft es, zuerst ein separates Testprojekt zu erstellen, und damit einen Verbindungsaufbau zu einem TLS 1.3 Server zu probieren. Alternativ kann auch ein kommerzieller SSL Handler verwendet werden. Der wird dann in Indy einfach anstelle des normalen Indy Handlers zugewiesen. Die werden z.B. hier genannt: ![]() |
AW: Indy & OpenSSL 1.1.1 & TLS 1.3
Den Code aus dem Repo hab' ich.
Die Idee war, einfach den "alten" IOHandler durch den neuen (TIdOpenSSLIOHandlerServer) zu ersetzen. Da unser WS als Server fungiert klang das naheliegend. War wohl zu einfach gedacht. Die Behebung eines Problems macht gleich 2 neue auf.
Code:
Der Typ ist in idGlobal definiert, in IdOpenSSLHeaders_async wird auf idGlobal verwiesen und das Verzeichnis steht im Suchpfad des Projektes.
[dcc32 Fehler] IdOpenSSLHeaders_async.pas(70): E2003 Undeklarierter Bezeichner: 'TIdC_SIZET'
Natürlich kann ich jetzt idGlobal in das Projekt mit aufnehmen. Dann kommt der nächste Fehler:
Code:
Das kann aber nicht Sinn und Zweck der Übung sein.
[dcc32 Fehler] IdOpenSSLHeaders_bio.pas(284): E2003 Undeklarierter Bezeichner: 'TIdC_SIZET'
Irgendwie krieg' ich das jetzt nicht mehr gewechselt ... |
AW: Indy & OpenSSL 1.1.1 & TLS 1.3
Zitat:
Wenn ich nun IOHandlerServer := TIdOpenSSLIOHandlerServer.Create; verwende, kompiliert das Projekt ohne Fehler. Ich vermute, entweder ist der Projektsuchpfad nicht korrekt oder es werden Units im Projektsuchpfad gefunden, die aus einer anderen Indy-Version kommen. |
AW: Indy & OpenSSL 1.1.1 & TLS 1.3
Zitat:
Ich versuche mal, die temporär woanders hinzuschieben ... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:28 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