Einzelnen Beitrag anzeigen

WladiD

Registriert seit: 27. Jan 2006
Ort: Celle
135 Beiträge
 
Delphi 10.4 Sydney
 
#1

CETP over TLS - TI-Konnektor

  Alt 22. Apr 2021, 10:29
Hallo zusammen,

ich komme hier schon seit Tagen einfach nicht weiter. Das Thema ist sehr speziell, aber vielleicht gibt es ja doch einen Leidensgenossen hier, der im TI-Medizinwesen unterwegs ist.

CETP ist die Abkürzung für Connector Event Transport Protocol und wird vom TI-Konnektor bereitgestellt. Die Funktionsweise ist eigentlich ganz simpel, das PVS (Praxisverwaltungssystem) abonniert über einen SOAP-Call die gewünschten Ereignisse und teilt in diesem mit auf welchem Port es einen TCP-Server bereitstellt. Der Konnektor sendet dann die Nachrichten wenn das entsprechende Ereignis eintritt (z.B. wenn eine Karte ins Kartenterminal gesteckt wird).

Die unverschlüsselte CETP-Variante in unserem PVS funktioniert von Anfang an problemlos. Ihr ahnt es schon…die TLS-Variante kriege ich einfach nicht. Als Netzwerkkomponente kommt hier die aktuellste Indy-Version unter Delphi 10.1 zum Einsatz.

Die Anforderung von der Gematik ist wie folgt:
---
GS-A_4384 - TLS-Verbindungen
Alle Produkttypen, die Übertragungen mittels TLS durchführen, MÜSSEN die folgenden
Vorgaben erfüllen:
• Zur Authentifizierung MUSS eine X.509-Identität gemäß [gemSpec_Krypt#GS-A_4359] verwendet werden.
• Als Cipher Suite MUSS TLS_DHE_RSA_WITH_AES_128_CBC_SHA oder TLS_DHE_RSA_WITH_AES_256_CBC_SHA verwendet werden.
• Es MUSS für die Schlüsselaushandlung Gruppe 14 (definiert in [RFC-3526], verwendbar bis Ende 2023) verwendet werden.
• Der private DH-Exponent für den Schlüsselaustausch MUSS eine Länge von mindestens 256 Bit haben
---

Hier der aktuelle Code:
Delphi-Quellcode:

procedure TCommunicator.StartListener(Topics: TCETPEvents);

  function CreateIOHandler: TIdServerIOHandlerSSLOpenSSL;
  begin
    Result := TIdServerIOHandlerSSLOpenSSL.Create(FCETPServer);

    if FClientAuthMode = camCertificate then
    begin
      Result.SSLOptions.CertFile := 'C:\Dev-master\exe\kiwi.crt.pem';
      Result.SSLOptions.KeyFile := 'C:\Dev-master\exe\kiwi.key.pem';
      Result.OnGetPassword := CertificatePassEventHandler;
    end;

    Result.SSLOptions.Mode := sslmServer;
    Result.SSLOptions.Method := sslvTLSv1_2;
    Result.SSLOptions.SSLVersions := [sslvTLSv1_2];
    Result.SSLOptions.CipherList := 'DHE-RSA-AES256-SHA'; // TLS_DHE_RSA_WITH_AES_256_CBC_SHA
    Result.SSLOptions.DHParamsFile := 'C:\Dev-master\exe\dhparam.pem';
  end;

begin
  // Ausführung in Thread leiten
  if not InCurrentThread then
  begin
    FMethods.Add(
      procedure
      begin
        StartListener(Topics);
      end);
    Exit;
  end;

  if Assigned(FCETPServer) or (FCETPPort <= 0) then
    Exit;

  FCETPServer := TIdTCPServer.Create(nil);

  // Wenn es eine TLS-Pflicht gibt, dann muss auch CETP over TLS laufen
  if FTLSMandatory then
  begin
    FCETPServer.IOHandler := CreateIOHandler;
    FCETPServer.OnConnect := CETPServerConnect;
  end;

  FCETPServer.DefaultPort := FCETPPort;
  FCETPServer.ReuseSocket := rsOSDependent;
  FCETPServer.ListenQueue := 15;
  FCETPServer.UseNagle := True;
  FCETPServer.OnExecute := CETPResponseExecute;
  FCETPServer.Active := True;

  if Assigned(FOnStartListener) then
    Synchronize(
      procedure
      begin
        FOnStartListener(Self);
      end);

  if Topics = [] then
    SubscribeDefault
  else if Topics <> [ceUnknown] then
    SubscribeForCETPEvents(Topics);
end;

procedure TCommunicator.CertificatePassEventHandler(var Password: string);
begin
  Password := FClientAuthCertFilePass
end;

procedure TCommunicator.CETPServerConnect(AContext: TIdContext);
begin
  if FTLSMandatory and (AContext.Connection.IOHandler is TIdSSLIOHandlerSocketBase) then
    TIdSSLIOHandlerSocketBase(AContext.Connection.IOHandler).PassThrough := False;
   
  // An dieser Stelle wird eine Exception mit der Meldung 'Error accepting connection with SSL.' ausgelöst
end;
Mein großes Problem an der Sache, dass der Fehler von der OpenSSL-Funktion SSL_accept geworfen wird und ich somit überhaupt nicht nachvollziehen kann, an welcher Stelle genau und weshalb der Fehler auftritt. Die Meldung 'Error accepting connection with SSL.' ist überhaupt nicht aussagekräftig.
Waldemar Derr
Profil bei GitHub

Geändert von WladiD (22. Apr 2021 um 10:32 Uhr) Grund: Code an sslvTLSv1_2 angepasst
  Mit Zitat antworten Zitat