Synapse SSL Verbindungen, aber wie ?

Alle Fragen zur Netzwerkkommunikation
Antworten
Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1693
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Synapse SSL Verbindungen, aber wie ?

Beitrag von corpsman »

Hallo zusammen,

ich will via "internet" zwischen 2 Lazarus Instanzen Kommunizieren dazu verwende ich normalerweise lNet, aber da das wohl keine Verschlüsselung kann, und es schon "sicher" sein sollte, habe ich mich nun dazu entschieden mittels Synapse das lNet interface nach zu bauen (Denn unter Synapse geht ssl anscheinend).

Dazu habe ich mir eine TSynapseComponent gebaut, die ähnlich zu lNet methoden wie

Code: Alles auswählen

    OnAccept: TSocketEvent;
    OnConnect: TSocketEvent;
    OnDisconnect: TSocketEvent;
    OnError: TSocketErrorEvent;
    OnReceive: TSocketEvent;
    
hat und das ganze TThread gefrickel im Hintergrund für mich macht. Unverschlüsselt funktioniert die Demo auch schon, welche ich ebenfalls in den Anhang gepackt habe (ebenfalls ein Zertifikat und einen Key zum wegwerfen ;)).

Damit ihr euch im Code zurecht findet.
der Server wartet im TAcceptThread auf hereinkommende Anfragen, kommt eine übergibt er den Socket an TSynapseComponent dieser verwaltet diesen dann als "client"
der Client verbindet sich direkt als Client und übergibt dann ebenfalls den Socket an TSynapseComponent dieser verwaltet diesen dann als "client"

Beides wird mittels InternalAddClient gemacht.
InternalAddClient wiederrum verschiebt den Socket in einen eigenen Thread, so dass diese den Hauptthread nicht blockieren, daraus ergibt sich dann folgender Execute code für den TClientThread:

Code: Alles auswählen


Procedure TClientThread.Execute;
Begin
  // Setup:
  //  Nichts zu tun der Erzeuger dieses Threads hat
  //  FOwner, FSocket bereits korrekt initialisiert ;)
  FConnection := TSynapseConnection.Create(FOwner, FSocket, fID);

  // Optional: SSL-Handschake
  If FOwner.UseSSL Then Begin
    Case FOwner.fMode Of
      mServer: Begin
          FSocket.SSL.CertificateFile := FOwner.SSLCertFile;
          FSocket.SSL.PrivateKeyFile := FOwner.SSLKeyFile;
          If Not FSocket.SSL.Accept Then Begin // Der Server Triggert ein Accept ? ist das überhaupt Richtig ?
            Synchronize(@SSLErrorClient);
            Terminate;
            exit;
          End;
        End;
      mClient: Begin
          FSocket.SSL.CertCAFile := FOwner.SSLCAFile; // optional
          FSocket.SSLDoConnect(); // Der Client will verbinden
        End;
    End;
    If FSocket.SSL.LastError <> 0 Then Begin
      Synchronize(@SSLErrorClient);
      Terminate;
      exit;
    End;
  End;

  // Der Server hat einen neuen Client akzeptiert
  If FOwner.fMode = mServer Then Begin
    Synchronize(@AcceptClient);
  End;
  // Wir sind erfolgreich mit dem Server verbunden
  If FOwner.fMode = mClient Then Begin
    Synchronize(@ConnectClient);
  End;

  // Execute
  While Not Terminated Do Begin
    If (FSocket <> Nil) And FSocket.CanRead(PollTimeoutms) Then Begin
      If (FSocket = Nil) Or (FSocket.WaitingData = 0) Then Begin
        Synchronize(@RemoveClient);
      End
      Else Begin
        Synchronize(@ReadData);
      End;
    End;
    If assigned(FSocket) And (FSocket.LastError <> 0) Then Begin
      Synchronize(@ErrorClient);
      Terminate;
    End;
    sleep(1);
  End;
  // Teardown
  If assigned(FOwner) Then Begin
    Synchronize(@RemoveClient);
  End;
End;  
Prinzipiell scheint das auch zu gehen, aber damit der Client erfolgreich verbinden kann, muss der Server erst mal irgendwas senden, danach können dann beide immer senden wie sie mögen, der jeweils andere Empfänger empfängt aber komischerweise immer noch "Müllbytes" hinter den eigentlich gesendeten.

Tante Google hat mir leider nichts vernünftiges zum Thema "Demo" / "Example" gegeben und ChatGTP dreht sich im Kreis :(

Hat einer von Euch ein paar nützliche Ideen / Anregungen wie ich das noch retten könnte ?
Dateianhänge
Synapse_ssl.zip
(38.73 KiB) 184-mal heruntergeladen
--
Just try it

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1693
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Synapse SSL Verbindungen, aber wie ?

Beitrag von corpsman »

Also das "komische" empfangen hab ich heraus gefunden:

Code: Alles auswählen

Function TSynapseConnection.GetMessage(Out DataString: String): integer;
Var
  WaitingData: Integer;
Begin
  Result := 0;
  If Not assigned(FSocket) Then exit;

  WaitingData := FSocket.WaitingData;
  DataString := '';
  If WaitingData <> 0 Then Begin
    setlength(DataString, WaitingData);
    If FOwner.UseSSL Then Begin
      result := FSocket.ssl.RecvBuffer(@DataString[1], WaitingData);
    End
    Else Begin
      result := FSocket.RecvBuffer(@DataString[1], WaitingData);
    End;
    If WaitingData <> result Then // Why ever in SSL mode waiting data is sometimes more then result, so trim the final result if needed
      setlength(DataString, result);
  End;
End;  
Löst das, bleibt noch offen:
- Warum muss der Server was senden damit der Client erfolgreich verbinden kann
- Ist das Accept des Servers richtig ?
- Wird überhaupt verschlüsselt übertragen ? (das werde ich mal versuchen mittels WireShark raus zu bekommen ..)
Zuletzt geändert von corpsman am So 28. Dez 2025, 17:24, insgesamt 1-mal geändert.
--
Just try it

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1693
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Synapse SSL Verbindungen, aber wie ?

Beitrag von corpsman »

Ist das nun Besser oder schlechter ?

anscheinend soll man FSocket.SSLAcceptConnection nehmen, dann klappt es auch mit dem Verbinden, aber leider muss der Server immer noch irgendwas senden befor der Client "verbunden" wird :/

Code: Alles auswählen


Procedure TClientThread.Execute;
Begin
  // Setup:
  //  Nichts zu tun der Erzeuger dieses Threads hat
  //  FOwner, FSocket bereits korrekt initialisiert ;)
  FConnection := TSynapseConnection.Create(FOwner, FSocket, fID);

  // Optional: SSL-Handschake
  Case FOwner.fMode Of
    mServer: Begin
        If FOwner.UseSSL Then Begin
          FSocket.SSL.CertificateFile := FOwner.SSLCertFile;
          FSocket.SSL.PrivateKeyFile := FOwner.SSLKeyFile;
          If Not FSocket.SSLAcceptConnection Then Begin // Der Server startet eine SSL Verbindung
            Synchronize(@SSLErrorClient);
            Terminate;
            exit;
          End;
          If FSocket.SSL.LastError <> 0 Then Begin
            Synchronize(@SSLErrorClient);
            Terminate;
            exit;
          End;
          If FSocket.LastError <> 0 Then Begin
            Synchronize(@ErrorClient);
            Terminate;
            exit;
          End;

        End;
      End;
    mClient: Begin
        If FOwner.SSLVerify Then Begin
          FSocket.SSL.CertCAFile := FOwner.SSLCAFile; // optional
          FSocket.SSLDoConnect(); // Der Client will verbinden
        End;
      End;
  End;

  // Der Server hat einen neuen Client akzeptiert
  If FOwner.fMode = mServer Then Begin
    Synchronize(@AcceptClient);
  End;
  // Wir sind erfolgreich mit dem Server verbunden
  If FOwner.fMode = mClient Then Begin
    Synchronize(@ConnectClient);
  End; 
--
Just try it

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1693
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Synapse SSL Verbindungen, aber wie ?

Beitrag von corpsman »

Also wenn ich das richtig verstehe scheint es tatsächlich verschlüsselt zu kommunizieren:
Sniff.png
(293.05 KiB) Noch nie heruntergeladen
Dann bleibt nur noch zu klären, warum der Server nach dem Accept zuerst mindestens 1 Byte senden muss damit der Client ein Verbunden erkennt ..
--
Just try it

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1693
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Synapse SSL Verbindungen, aber wie ?

Beitrag von corpsman »

So also ansich läuft es nun ganz gut, ich habe nur noch einen HACK drin den ich nicht verstehe, bzw nicht weiß wie ich ihn los werde :(.

Beim verschlüsselten Verbinden muss der Server direkt nach dem SSLAcceptConnection mindestens 1 Byte senden, da sonst der Client LCL Thread hängt (was super spooky ist, weil der ja mal gar nichts mit all dem zu tun hat)

Code: Alles auswählen

 // Der Server hat einen neuen Client akzeptiert
  If FOwner.fMode = mServer Then Begin
    If FOwner.UseSSL Then Begin
      // Ohne dieses Byte hängt der Client nach dem verbinden bis der Server endlich etwas sendet :(
      i := 0;
      FSocket.SendBuffer(@i, 1); // Das Doofe ist, der Client empfängt dieses Byte auch und reicht es an die GUI weiter..
    End;
    Synchronize(@AcceptClient);
  End;               
Falls noch wer ne Idee hat, habe ich meinen Stand mal mit angehängt..
Dateianhänge
usynapsecomponents.pas
(18.96 KiB) 356-mal heruntergeladen
--
Just try it

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 7043
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Synapse SSL Verbindungen, aber wie ?

Beitrag von af0815 »

Nur so als Gedanken.

Was soll das Erstellen eines Paketes auslösen, das geht ja nur über Daten. Und ein Byte löst nunmal als kleinste Einheit das aus.

Grundlegend, ist es vorgesehen Keep-Alive Pakete zu senden?

Du bist da sicher im untersten Level der Kommunikation, wenn du Daten hast, dann musst du die in ein eigenes Frame einbauen und auch eigene Keep alive Pakete senden, damit der Tunnel offen bleibt und nicht durch ein Timeout mal geschlossen wird. Oder ist das im SSL Protokoll drinnen und du müsstest nur das Keep-Alive auslösen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1693
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Synapse SSL Verbindungen, aber wie ?

Beitrag von corpsman »

Also wenn ich es richtig verstanden habe gibt es das keep alive im Protocoll schon, gute idee, ggf bekomme ich raus wie man das triggert ;).
[Edit]
Also das Keep alive zu triggern war nicht einfach, es wird so gemacht;

Code: Alles auswählen

    enable := 1;
      SetSockOpt(FSocket.Socket, SOL_SOCKET, SO_KEEPALIVE, @enable, SizeOf(enable));
      idle := 1; // nach 1s Leerlauf erstes Keep-Alive
      interval := 10; // 10s zwischen Paketen
      count := 1; // 1 Versuche
      SetSockOpt(FSocket.Socket, IPPROTO_TCP, 4{= TCP_KEEPIDLE}, @idle, SizeOf(idle));
      SetSockOpt(FSocket.Socket, IPPROTO_TCP, 5{= TCP_KEEPINTVL}, @interval, SizeOf(interval));
      SetSockOpt(FSocket.Socket, IPPROTO_TCP, 6{= TCP_KEEPCNT}, @count, SizeOf(count));                                                                                            
Laut wireshark ging das auch raus, aber gebracht hats leider nichts :(
Wenn ich via L-Net auf meinen Server verbinde, dann geht es übrigens wunderbar, also
SSL Synapse Server, mit SSL lNet Client
einen SSL lNet Server kann man aber wohl nicht erstellen (oder zumindest ich nicht :/) und der von mir gebastelte SSL Synapse Client hat den beschriebenen Bug :(
--
Just try it

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1693
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Synapse SSL Verbindungen, aber wie ?

Beitrag von corpsman »

So ich hab meinen Stand nu mal auf Github hochgeladen.
Und auch mal im Orig Repo in den Issues darauf verwiesen, mal sehen ob was passiert ;)
--
Just try it

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 7043
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Synapse SSL Verbindungen, aber wie ?

Beitrag von af0815 »

corpsman hat geschrieben: Mo 29. Dez 2025, 10:05 Und auch mal im Orig Repo in den Issues darauf verwiesen, mal sehen ob was passiert ;)
Ich habe nicht den Eindruck das Lukas noch viel aktiv ist. Erwarte dir da nicht mehr viel.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1693
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Synapse SSL Verbindungen, aber wie ?

Beitrag von corpsman »

hmm,
Wenn lNet nicht geht weil es nur SSL als Client unterstützt, ich Synapse nicht zum laufen bekomme bzw. das gar nicht mehr gepflegt wird und ich mich irgendwie nicht mit Indy anfreunden kann, dann wirds wohl Eng mit TLS fähigen Netzwerk Componenten.

Mein Eigentliches Ziel ist es ja nur nen Server zu machen, der übers Internet erreichbar und halbwegs sicher (=verschlüsselte Kommunikation) ist.
--
Just try it

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 7043
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Synapse SSL Verbindungen, aber wie ?

Beitrag von af0815 »

Synapse als Server und lnet als Client geht nicht ?
Indy ist dagegen schon was schwergewichtiges.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

charlytango
Beiträge: 1216
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Synapse SSL Verbindungen, aber wie ?

Beitrag von charlytango »

corpsman hat geschrieben: Di 30. Dez 2025, 05:27 Mein Eigentliches Ziel ist es ja nur nen Server zu machen, der übers Internet erreichbar und halbwegs sicher (=verschlüsselte Kommunikation) ist.
ich kenne dein Setup und deine Absichten nicht, besonders ob der Server öffentlich erreichbar sein soll.

Falls das "nur" eine geschützte Verbindung sein soll, würde ich auf den ganzen SSL-Teil verzichten und die Sicherheit eine Stufe drunter ansiedeln.
dauernder VPN-Tunnel oder VPN Verbindung und eine entsprechend eingeschränkte Firewall und du musst dein Programm nicht ändern. Und die Sicherheitsstufe ist nochmal eine ganz andere.
Das muss jetzt ja nicht eine sog Markenfirewall sein.
Als Hardware irgendetwas wie das:

oder noch kleiner. PfSense oder OpenSense drauf und OpenVPN oder Wireshark VPN drauf installieren.

Ist nur eine Lösung abseits der Softwaremöglichkeiten ;-)

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1693
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Synapse SSL Verbindungen, aber wie ?

Beitrag von corpsman »

hmm, ja an VPN hatte ich auch schon kurz gedacht.

Mein "Ziel" Setup ist dass der Server auf nem Raspi in meinem Heim Netz läuft (weil der ist eh 24/7 an), Haus Intern ist der Zugriff da easy, aber es gibt halt auch einen User, der gerne von Extern drauf zugreifen wollte. Ein VPN tunnelt ja den gesammten Traffic und so "offen" wollte ich zu dem einen User eigentlich nicht sein. Dazu noch hat der User Windows 11 und ich ja sonst nur Linux, da wäre der TLS Login und ein Portforwarding / Dyndns auf den Raspi irgendwie das gewesen was ich mir unter "einfach" vorgestellt hatte. Lasse mich aber gerne eines Besseren Belehren ;)
--
Just try it

Stevie
Beiträge: 186
Registriert: Di 27. Feb 2024, 22:40

Re: Synapse SSL Verbindungen, aber wie ?

Beitrag von Stevie »

corpsman hat geschrieben: Di 30. Dez 2025, 05:27 Mein Eigentliches Ziel ist es ja nur nen Server zu machen, der übers Internet erreichbar und halbwegs sicher (=verschlüsselte Kommunikation) ist.
Was für eine Nutzlast soll denn über die Leitung gehen? Schwebt Dir eine Art REST-API vor, die an Port 443 (o.ä.) angeboten wird und über die Deine Clients asynchron Daten abrufen können sollen? Falls das so ist, wäre dann die FPHttpApp nicht der bessere, weil einfachere, Kommunikationsweg? Von Markus Fernström gibt es da ein nettes, kompaktes Tutorial unter https://medium.com/@marcusfernstrm/crea ... 1e4aa447b7 und natürlich gibt es auch im Freepascal-Wiki eine sehr brauchbare Basis: https://wiki.freepascal.org/fphttpserver...

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1693
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Synapse SSL Verbindungen, aber wie ?

Beitrag von corpsman »

Das Genaue Datenformat ist mir recht "egal", es werden sehr selten Binärblobs von ca 1-10MB gesendet / empfangen.
Also meine Anwendung zieht sich quasi beim Start die Aktuelle "DB" (was ein Binärfile ist) und kann auf wunsch die Aktualisierte "DB" wieder hochladen..
--
Just try it

Antworten