TsgcWebSocketServer › Properties › SSLOptions
Hält Zertifikatspfade, TLS-Versionsauswahl und OpenSSL-Tuning für den TLS-Listener.
property SSLOptions: TsgcWSSSL_Options read FSSLOptions write SetSSLOptions;
Version=tlsUndefined, VerifyCertificate=False
Stellen Sie das Zertifikatsmaterial bereit, bevor Sie den Server aktivieren, wenn SSL True ist: RootCertFile, CertFile und KeyFile verweisen auf PEM-Dateien (verwenden Sie für alle drei denselben Pfad, wenn die Datei die vollständige Kette enthält), und Password ist nur erforderlich, wenn der private Schlüssel verschlüsselt ist. Setzen Sie VerifyCertificate auf True, um Client-Zertifikate anzufordern und zu validieren (die Unteroptionen FailIfNoCertificate und VerifyClientOnce verfeinern die Prüfung), wobei VerifyDepth die Kettenlänge steuert. Version wählt eine bestimmte TLS-Version (tls1_0, tls1_1, tls1_2, tls1_3) oder lässt die Aushandlung offen (tlsUndefined). Bei iohNativeTLS ist sie stattdessen die niedrigste zulässige Version, siehe unten. OpenSSL_Options stellt Low-Level-Stellschrauben bereit: APIVersion (oslAPI_1_0/oslAPI_1_1/oslAPI_3_0), LibPath/LibPathCustom zum Auffinden der OpenSSL-Binärdateien, UnixSymLinks, ECDHE, CipherList, CurveList, VersionMin und X509Checks für die Hostname-/IP-Validierung.
VerifyCertificate sagt nichts darüber aus, ob das Client-Zertifikat seit seiner Ausstellung widerrufen wurde, sodass ein Zertifikat, dessen Schlüssel gestohlen und dessen Seriennummer inzwischen widerrufen wurde, bis zu seinem Ablauf weiterhin eine Sitzung öffnet. Mit IOHandler=iohSChannel wird der Widerrufsstatus des Client-Zertifikats nur dann geprüft, wenn SChannel_Options.Revocation.Check auf einen anderen Wert als scrcDisabled (Standard) gesetzt ist: scrcEndCertificate prüft ausschließlich das Client-Zertifikat, scrcChainExcludeRoot prüft es zusammen mit den Zwischenzertifikaten und scrcChain schließt das Stammzertifikat ein. Revocation.Timeout begrenzt den gesamten Abruf über CRL und OCSP (standardmäßig 5000 ms), sodass ein nicht erreichbarer Responder den Handshake nicht blockieren kann, Revocation.CacheOnly verwendet nur das, was Windows bereits zwischengespeichert hat, und greift nie auf das Netzwerk zu, und Revocation.IgnoreRevocationOffline sowie Revocation.IgnoreNoRevocationCheck (beide True) entscheiden, ob ein nicht erreichbarer Responder oder ein Client-Zertifikat ohne veröffentlichte Widerrufsinformationen akzeptiert wird. Ein Zertifikat, dessen Widerruf bestätigt ist, wird immer abgelehnt. Das Setzen von Preset := tlspSecureDefaults aktiviert die Prüfung als scrcChainExcludeRoot und behält beide Soft-Fail-Einstellungen bei, sodass ein Client, der zuvor zugelassen wurde, weiterhin zugelassen wird. Siehe Server SSL | SChannel Client Certificate Revocation.
IOHandler wählt die TLS-Engine aus. iohOpenSSL ist der Standard und iohSChannel verwendet den Windows-Provider. iohNativeTLS wählt die in reinem Object Pascal geschriebene TLS-Engine des sgcCrypto-Packs, die TLS 1.3 und TLS 1.2 beherrscht: Es wird keine OpenSSL-Bibliothek geladen, und bei TLS 1.3 werden die hybriden Post-Quanten-Schlüsselaustauschgruppen von RFC 10024 angeboten, mit X25519MLKEM768 an erster Stelle. Ihre beiden Präferenzlisten sind NativeTLS_Options.Groups und NativeTLS_Options.CipherSuites, durch Doppelpunkte getrennt im OpenSSL-Stil, und eine leere Liste behält die Standardwerte der Engine bei. Die Engine läuft auf der klassischen Engine mit einem Thread pro Verbindung ebenso wie auf den IOCP- und EPOLL-Engines. iohAppleTLS und iohAndroidTLS sind reine Client-Handler: Ein Server mit einem von beiden löst eine Ausnahme aus, wenn Active auf True gesetzt wird, sofern OnSSLGetHandler nicht selbst einen Handler liefert. Verwenden Sie stattdessen iohNativeTLS, iohOpenSSL oder unter Windows iohSChannel.
Bei der nativen Engine ist Version die niedrigste zulässige Version, keine exakte Version wie bei iohOpenSSL. tlsUndefined (Standard) und tls1_2 akzeptieren TLS 1.3 und TLS 1.2, tls1_3 akzeptiert ausschließlich TLS 1.3, und tls1_0 oder tls1_1 lösen beim Start des Servers einen Konfigurationsfehler aus, denn die Engine unterstützt ausschließlich TLS 1.2 und TLS 1.3. Um ausschließlich TLS 1.2 zu akzeptieren, nennen Sie in NativeTLS_Options.CipherSuites nur TLS-1.2-Suites, etwa TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256. Die Engine validiert Client-Zertifikate anhand der Vertrauensanker aus RootCertFile, zuzüglich der Vertrauensanker, denen das Betriebssystem vertraut, wenn NativeTLS_Options.UseSystemRoots True ist (Standard ist False). Bei iohNativeTLS kann CertFile auch eine .pfx- oder .p12-Datei sein, die das Zertifikat, die Kette und den Schlüssel enthält und mit Password geöffnet wird. Die Engine nimmt Sitzungen mit TLS-1.3- und TLS-1.2-Session-Tickets wieder auf: NativeTLS_Options.SessionTickets (Standard True) schaltet dies ein, und NativeTLS_Options.TicketLifetime (Standard 7200 Sekunden) legt fest, wie lange ein Ticket verwendet werden kann. Die Wiederaufnahme bei TLS 1.2 setzt voraus, dass der Client das Extended Master Secret unterstützt. Sie akzeptiert kein 0-RTT, und sie löst OnSSLVerifyPeer nicht aus, das zum OpenSSL-Handler gehört. VerifyCertificate fordert vom Client ein Zertifikat an und validiert es, VerifyCertificate_Options.FailIfNoCertificate weist einen Client ab, der keines sendet, und VerifyClientOnce hat keine Wirkung, weil die Engine nie neu aushandelt. Siehe Native TLS.
AllowPlainText (standardmäßig False) lässt den TLS-Listener auf demselben Port auch unverschlüsselte HTTP- und WebSocket-Verbindungen annehmen. Der Server prüft das erste Byte jeder neuen Verbindung: $16 (TLS-Handshake-Record) bedeutet TLS, alles andere wird als Klartext behandelt, und trifft innerhalb von PlainTextTimeout (Millisekunden, standardmäßig 5000) kein Byte ein, wird die Verbindung als TLS behandelt. PlainTextPolicy legt fest, was mit einer unverschlüsselten Verbindung geschieht: ptpServe (Standard) bedient die Anfrage normal, ptpRedirect antwortet mit 308 Permanent Redirect auf https://<Host><path> und behält dabei Methode und Body bei (400 Bad Request, wenn die Anfrage keinen Host-Header hat), und ptpReject antwortet mit 400 Bad Request und schließt die Verbindung. Die Verbindungseigenschaft TLS von TsgcWSConnectionServer gibt an, ob eine Verbindung TLS verwendet. Diese Optionen funktionieren mit dem Standard-Indy-IOHandler und mit den IOHandlern IOCP und EPOLL. Innerhalb von OnCommandGet gibt die Servermethode IsTLS(AContext) an, ob die Anfrage TLS verwendet. Siehe TLS und unverschlüsseltes HTTP am selben Port.
oServer := TsgcWebSocketServer.Create(nil);
oServer.SSL := true;
oServer.SSLOptions.CertFile := 'c:\certificates\mycert.pem';
oServer.SSLOptions.KeyFile := 'c:\certificates\mycert.pem';
oServer.SSLOptions.RootCertFile := 'c:\certificates\mycert.pem';
oServer.SSLOptions.Version := tls1_3;
oServer.SSLOptions.OpenSSL_Options.VersionMin := tls1_2;
oServer.SSLOptions.Port := 443;
oServer.Active := true;