OpenSSL oder native Kryptographie in Delphi: zur Laufzeit wählen

· Komponenten
OpenSSL oder native Kryptographie in Delphi: zur Laufzeit wählen

Die OpenSSL-DLLs aus einer Delphi-Anwendung zu entfernen war früher eine Build-Entscheidung. Man aktivierte ein Compiler-Define, baute neu und lieferte eine zweite ausführbare Datei an die Kunden aus, die kein OpenSSL auf ihren Rechnern haben durften. sgcWebSockets 2026.10 macht daraus eine Laufzeitentscheidung: eine einzige globale Variable, einmal beim Start gesetzt, entscheidet, ob die Anwendungskryptographie auf OpenSSL läuft oder auf der in die Bibliothek eingebauten, in Object Pascal geschriebenen Kryptographie.

Die Verbindungsseite, TLS ohne OpenSSL, wird in Delphi TLS 1.3 ohne OpenSSL-DLLs behandelt. Dieser Beitrag handelt von allem anderen: den Signaturen, Hashes, dem Schlüsselaustausch und der Verschlüsselung, die Ihre Anwendung außerhalb des TLS-Handshakes durchführt.

Eine Zeile beim Start

Die Unit sgcBase_Helpers deklariert die globale Variable sgcCryptoBackend vom Typ TsgcCryptoBackend:

uses
  sgcBase_Helpers;

begin
  sgcCryptoBackend := cbNative;
  sgcCheckNativeCrypto;
  Application.Initialize;
  ...

Der Schalter ist global, nicht pro Komponente, setzen Sie ihn also, bevor eine Komponente erstellt wird. sgcCheckNativeCrypto ist optional: Sind die nativen Krypto-Units nicht mit einkompiliert, löst er beim Start eine klare Meldung aus, statt bei der ersten Signatur, die Ihre Anwendung erstellen will.

Drei Werte

cbAuto ist die richtige Wahl für Produkte, die auf beide Arten ausgeliefert werden. Manche Kunden installieren die OpenSSL-Bibliotheken neben der ausführbaren Datei, manchen ist das nicht erlaubt, und derselbe Build funktioniert für beide, ohne ein Support-Ticket wegen einer fehlenden DLL.

// same executable, with or without the OpenSSL libraries beside it
sgcCryptoBackend := cbAuto;

Was dem Schalter folgt

Der Schalter deckt die Kryptographie ab, die die Komponenten für Sie erledigen:

Keiner dieser Bereiche erfordert eine Codeänderung. Ein JWT, das gestern mit OpenSSL signiert wurde, wird heute nativ signiert, weil die Variable es so vorgibt.

Die Verbindungen sind eine eigene Einstellung

sgcCryptoBackend ändert nicht, wie eine Komponente sich verbindet. Das TLS einer Verbindung wird pro Komponente gewählt, mit IOHandler = iohNativeTLS, bei den TCP-, HTTP- und WebSocket-Komponenten und allem, was darauf aufbaut, wie MQTT, bei QUIC und HTTP/3, und bei DTLSOptions für WebRTC:

sgcCryptoBackend := cbNative;                  // application crypto
oClient.TLSOptions.IOHandler := iohNativeTLS;  // this connection

Eine Komponente, die beim OpenSSL-Handler bleibt, lädt beim Verbinden weiterhin OpenSSL. Mit iohNativeTLS bei QUIC, HTTP/3 und DTLS wird überhaupt kein OpenSSL verwendet, unabhängig davon, was der Schalter sagt. Eine Anwendung, die nirgends OpenSSL haben möchte, setzt beides: den Schalter für ihre Kryptographie und den Handler bei jeder Komponente, die eine sichere Verbindung öffnet.

Das Define ist jetzt optional

Bisher bedeutete der Betrieb ohne OpenSSL das Compiler-Define SGC_NATIVE_CRYPTO. Es wird nicht mehr benötigt. Ohne es werden sowohl der OpenSSL- als auch der native Code einkompiliert, und die Variable entscheidet zur Laufzeit.

Das Define hat noch einen Nutzen. Es erzwingt das native Backend, egal was sgcCryptoBackend sagt, und entfernt den OpenSSL-Code aus den Anwendungs-Krypto-Units, sodass die ausführbare Datei kleiner wird. Wenn Sie wissen, dass ein Build nie OpenSSL verwenden wird, ist es weiterhin die richtige Wahl. Wenn Sie es noch nicht wissen, lassen Sie es aus und entscheiden Sie beim Start.

Warum das wichtig ist

Aktualisierung

Nichts ändert sich, bis Sie die Variable setzen, weil cbOpenSSL die Vorgabe ist. Um das native Backend auszuprobieren, fügen Sie die beiden obigen Zeilen zu Ihrer Projektdatei hinzu, führen Sie Ihre Tests aus und vergleichen Sie. Die vollständige Liste dessen, was dem Schalter folgt, und welche Einstellung jeder Bereich für null OpenSSL zur Laufzeit benötigt, finden Sie im Hilfethema Betrieb ohne OpenSSL.

Weiterlesen

Fragen, Feedback oder Hilfe bei der Migration? Kontaktieren Sie uns. Sie erhalten eine Antwort von den Leuten, die den Code geschrieben haben.