2026.9.0 ist für alle Produkte gleichzeitig da: sgcWebSockets, sgcWebSockets .NET, sgcSign, sgcIndy und sgcOpenAPI. Es ist das größte Release des Jahres. Zwei völlig neue Pakete kommen zu sgcWebSockets hinzu, die Server-Engines wurden rund um ein Problem überarbeitet, das seit Langem Anfragen verloren hat, und die Signaturbibliothek hat gelernt, eine Signatur gegen etwas anderes als sich selbst zu prüfen.
Dieser Beitrag geht durch, was in jedem Produkt wichtig ist, mit dem Delphi-Code dort, wo er hilft. Alles steht im Changelog, und die Teile, die bestehendes Verhalten ändern, sind gegen Ende gesammelt, damit Sie sie vor dem Upgrade lesen können.
Die ganze Version in weniger als vier Minuten. Auch auf YouTube.
| Produkt | Neu | Fehlerbehebungen | Inkompatible Änderungen |
|---|---|---|---|
| sgcWebSockets | 25 | 56 | 22 |
| sgcSign | 25 | 70 | 21 |
| sgcOpenAPI | 9 | 25 | 5 |
| sgcWebSockets .NET | 5 | 24 | 10 |
| sgcIndy | 0 | 5 | 0 |
sgcWebSockets 2026.9.0
sgcWebRTC, eine native WebRTC-Medien-Engine
Das neue Paket sgcWebRTC macht TsgcRTCPeerConnection zu einem vollständigen WebRTC-Endpunkt. Audio- und Videoanrufe, Bildschirmfreigabe und SCTP-Datenkanäle, alles in Pascal, ohne Browser, ohne WebView-Steuerelement und ohne externe Medienbibliothek. Es läuft unter Windows, Linux, macOS, iOS und Android, und die Gegenstelle am anderen Ende kann ein Browser sein, denn das SDP, das erzeugt und verarbeitet wird, ist das echte.
Der Austausch von Offer und Answer folgt der W3C-Form, deshalb tun CreateOffer, CreateAnswer, SetLocalDescription, SetRemoteDescription und AddIceCandidate genau das, was ihre Namen sagen. Sie transportieren das SDP über den Signalisierungskanal, den Sie bereits haben, und das kann ein WebSocket-Server sein, der mit derselben Bibliothek gebaut wurde.
uses
sgcP2P;
var
oRTC: TsgcRTCPeerConnection;
begin
oRTC := TsgcRTCPeerConnection.Create(nil);
oRTC.RTCOptions.ICEServers.AddURL('stun:stun.l.google.com:19302');
oRTC.OnLocalDescription := OnLocalDescriptionHandler;
oRTC.OnICECandidate := OnICECandidateHandler;
oRTC.OnConnectionStateChange := OnConnectionStateChangeHandler;
oRTC.OnDataChannel := OnDataChannelHandler;
oRTC.CreateDataChannel('chat'); // forces RTCOptions.DTLS on
oRTC.CreateOffer; // gathers ICE candidates, builds the SDP offer
end;
procedure TForm1.OnLocalDescriptionHandler(Sender: TObject;
const aType, aSDP: string);
begin
// send aType + aSDP to the remote peer over your own signalling channel
end;
Medien funktionieren genauso. AddTrack hängt eine Opus- oder G.711-Audiospur an, oder eine VP8-, H.264- oder Motion-JPEG-Videospur, SendPCM und SendVideoFrame schieben aufgenommene Medien hinein, und OnAudio und OnVideoFrame übergeben Ihnen die dekodierte Spur der Gegenstelle.
Die alten Fallbacks aus der Browser-Ära gingen den umgekehrten Weg. Die Unterstützung für das AppRTC-Protokoll und die RTCMultiConnection-API wurde entfernt, und ebenso der Flash-Fallback, der 2020 das Ende seiner Lebensdauer erreicht hat. Siehe die Upgrade-Hinweise am Ende.
sgcCrypto, Kryptografie ohne OpenSSL
Das zweite neue Paket ist sgcCrypto, eine reine Pascal-Implementierung der Primitive, nach denen die meisten Anwendungen tatsächlich greifen. AES und ChaCha20/XChaCha20-Poly1305 als authentifizierte Verschlüsselung, SHA-2 und SHA-3, Argon2, scrypt und HKDF für Passwörter und Schlüsselableitung, Ed25519, Ed448, X25519, X448 und secp256k1, RSA-Schlüsselerzeugung, X.509-Zertifikats- und CSR-Erzeugung sowie die Post-Quanten-Algorithmen ML-KEM, ML-DSA und SLH-DSA.
Jedes Primitiv ist eine einfache Funktion. Es gibt kein Kontextobjekt, das erzeugt, konfiguriert und freigegeben werden muss, und keine DLL, die neben der ausführbaren Datei ausgeliefert werden muss.
uses
sgcCrypto_Random, sgcCrypto_AES, sgcCrypto_Keccak, sgcCrypto_Ed25519,
sgcCrypto_MLKEM;
var
vKey, vIV, vPlain, vAAD, vTag, vCipher: TBytes;
vDigest, vSeed, vSignature, vMessage: TBytes;
vPublicKey, vPrivateKey, vSharedSecret, vCiphertext: TBytes;
begin
// AES-256-GCM: authenticated encryption in one call
vKey := sgcRandomBytes(32);
vIV := sgcRandomBytes(12);
vPlain := TEncoding.UTF8.GetBytes('confidential payload');
vCipher := sgcAES_GCM_Encrypt(vKey, vIV, vPlain, vAAD, vTag);
// SHA-3-256, one call, no context object to manage
vDigest := sgcSHA3_256(vPlain);
// Ed25519: sign, then verify
vSeed := sgcRandomBytes(32);
vMessage := TEncoding.UTF8.GetBytes('sign me');
vSignature := sgcEd25519_Sign(vSeed, vMessage);
// ML-KEM-768: post-quantum key encapsulation (FIPS 203)
sgcMLKEM_GenerateKeyPair(mlkem768, vPublicKey, vPrivateKey);
sgcMLKEM_Encapsulate(mlkem768, vPublicKey, vCiphertext, vSharedSecret);
end;
Fünf vollständige sgcHTML-Anwendungen
sgcHTML erhält vier Komponenten und fünf Demos. Die Komponenten sind CameraScanner, ein Live-Kamerapanel, das Barcodes und QR-Codes mit dem im Browser eingebauten Scanner liest und immer eine manuelle Eingabe als Rückfallebene anbietet, sowie NumPad, CommandPalette und EmptyState.
Die fünf Demos sind keine Schnipsel. Jede einzelne ist eine vollständige Anwendung mit Anmeldung, Datenbank und druckbaren Berichten, und sie liegen unter Demos\60.HTML\01.RunTime: Lagerverwaltung, Kassensystem, ein Berichtsportal, eine mandantenfähige SaaS-Steuerungsebene und Außendiensteinsatzplanung.
Es gibt außerdem ein neues Hilfethema, Runtime vs Design-Time, mit Demos, die zeigen, wie dieselbe Seite entsteht, indem Sie Komponenten auf ein VCL-Formular ziehen, statt sie im Code zusammenzusetzen.
Die echte Client-Adresse hinter einem Reverse Proxy
Ein Server hinter nginx, Apache oder einem Cloud-Load-Balancer sieht bei jeder Verbindung die Adresse des Proxys, was bedeutet, dass Blacklist, Whitelist, GeoIP und Ihre eigenen Regeln alle auf den falschen Client geschaut haben. Die neuen ForwardedHeaders-Einstellungen von TsgcWebSocketFirewall holen die Adresse zurück, die der Proxy weitergeleitet hat.
Der Entwurf ist bewusst misstrauisch. Der Adresse in X-Forwarded-For oder X-Real-IP wird nur geglaubt, wenn die Verbindung selbst von einer Adresse kommt, die in TrustedProxies aufgeführt ist, damit ein Client keine erfinden kann, und die Kette wird von rechts gelesen, hinter der Anzahl von Proxys, die in TrustedHops angegeben ist, weil der Eintrag ganz links derjenige ist, den der Client geliefert hat. Die Auflösung läuft bei jeder Anfrage, da ein Proxy eine Verbindung für Anfragen von verschiedenen Aufrufern wiederverwendet.
uses
sgcWebSocket;
begin
oFirewall.ForwardedHeaders.Enabled := True;
oFirewall.ForwardedHeaders.TrustedProxies.Add('10.0.0.0/8');
oFirewall.ForwardedHeaders.TrustedProxies.Add('::1');
oFirewall.ForwardedHeaders.TrustedHops := 1;
oServer.Firewall := oFirewall;
end;
procedure TForm1.OnServerConnectHandler(Connection: TsgcWSConnection);
begin
// Connection.IP is now the end client
// Connection.PeerIP is still the proxy that opened the socket
end;
Einmal aufgelöst, ist das die Adresse, die jeder Blacklist-Eintrag, jede eigene Regel, jedes Ereignis und Ihr eigener Handler-Code sehen. Die Einstellungen verhalten sich auf dem http.sys-Server genauso wie auf dem Indy-Server, und dasselbe Feature kommt im sgcSign Server als server.firewall.forwarded_headers an.
Backpressure, die sich messen lässt
Wenn Sie schneller an einen langsamen Client schreiben, als dieser liest, wächst die Ausgangswarteschlange, bis etwas nachgibt. Von innerhalb der Anwendung gab es keine Möglichkeit, das zu sehen, deshalb haben Relays am Ende einen Stop-and-Wait-Austausch über die Leitung gemacht, nur um auf der sicheren Seite zu sein.
Zwei Ergänzungen ersetzen das. PendingCount auf TsgcWSConnection meldet, wie viele Nachrichten für diese Verbindung über die drei Prioritätsstufen hinweg noch in der Warteschlange stehen, und das Auslesen allokiert nichts, es kann also gepollt werden. OnQueueDrained wird ausgelöst, wenn die Warteschlange einer Verbindung von gefüllt auf leer wechselt, im Verbindungsthread, direkt nach dem Leeren und vor dem nächsten Lesen, sodass ein Credit ohne jede Verzögerung vergeben werden kann.
procedure TForm1.OnQueueDrainedHandler(Connection: TsgcWSConnection);
begin
// raised on the connection thread: do not touch the user interface here
SendNextBatch(Connection);
end;
procedure TForm1.SendIfRoom(Connection: TsgcWSConnection; const aText: string);
begin
if Connection.PendingCount < 100 then
Connection.WriteData(aText);
end;
Beide überqueren die DLL-Grenze, der .NET-Wrapper und jeder andere Host, der sgcWebSockets.dll nutzt, bekommen sie also ebenfalls. Die neuen Exporte werden angehängt, die bestehende Export-Reihenfolge bleibt daher unverändert.
Die EPOLL- und IOCP-Engines
Die Hochleistungs-Engines hatten eine Fehlerklasse mit einer einzigen Ursache: Sie gingen davon aus, dass eine Anfrage in einem einzigen Socket-Lesevorgang ankommt. Das stimmt in einem Loopback-Test und ist falsch an jeder MTU-Grenze, über ein VPN oder immer dann, wenn ein großer Body auf mehrere Pakete aufgeteilt wird.
Eine Anfrage, die nicht vollständig ankam, wurde verworfen, die Verbindung geschlossen und keine Antwort gesendet, und ein TLS-Record, der über zwei TCP-Segmente verteilt war, schloss die Verbindung sofort. Beides ist behoben, und die neue Option PartialRequestTimeout begrenzt, wie lange der Server auf den Rest wartet, in einem eigenen Thread-Pool, damit ein langsamer Client die anderen nicht aufhalten kann. In der EPOLL-Engine wurden Serververbindungen außerdem nie freigegeben, sobald der Client geschlossen hatte, deshalb wurde OnDisconnect nie ausgelöst und jeder Broadcast schrieb weiter in eine tote Verbindung.
Das ist auch der Grund, warum sich die Bedeutung von WorkOpThreads geändert hat. Es bindet eine Verbindung nicht mehr an einen Thread, weil eine Verbindung, die auf den Rest einer Anfrage wartete, jede andere Verbindung auf diesem Thread aufhielt. Es legt jetzt die kleinste Anzahl an Workern fest, die bereitgehalten wird, und der Pool wächst von dort aus.
QUIC und HTTP/3
Der QUIC- und HTTP/3-Client und -Server sprechen jetzt IPv6. Eine Adresse mit einem Doppelpunkt wird als IPv6 behandelt, eine URL kann sie in eckigen Klammern tragen, und ein Hostname wird über beide Familien aufgelöst, wo vorher nur IPv4 versucht wurde. Der HTTP/3-Listener ohne gesetzten Host bedient beide Familien über einen einzigen Socket, und eine neue Host-Eigenschaft in HTTP3Options bindet ihn an eine Schnittstelle, wenn Sie das brauchen.
Die größere Änderung ist, dass HTTP/3-Anfragen jetzt denselben Weg nehmen wie HTTP/1.1-Anfragen. Die OpenAPI-, MCP- und REST-API-Server, die Weiterleitung von Anfragen, CORS, Mandantenfähigkeit und Metriken haben überhaupt nie über HTTP/3 geantwortet, weil dieser Transport einen eigenen Weg hatte. Sie funktionieren jetzt alle.
Die Zertifikatsprüfung bei HTTP/3 ist der Punkt, den Sie zweimal lesen sollten. TLSOptions.VerifyCertificate war auf TsgcHTTP3Client standardmäßig True, die Prüfung wurde durchgeführt, und das Ergebnis wurde anschließend verworfen, deshalb hat jeder HTTP/3-Client jedes Zertifikat jeder Zertifizierungsstelle für jeden Host akzeptiert. Die Prüfung wird jetzt angewendet, was bedeutet, dass ein HTTP/3-Client, der mit einem selbstsignierten Endpunkt spricht, keine Verbindung mehr aufbaut, bis der Truststore oder das Zertifikat in Ordnung gebracht ist.
Die Exchange-API-Clients
Die fertigen Exchange-Clients hatten ein Reconnect-Problem, das sich wie ein viel merkwürdigeres Problem las. Private Subscriptions, also die Order-, Balance- und Fill-Feeds, wurden nach einem Reconnect bei Bitstamp, Coinbase, Deribit, Huobi, Kraken Spot und Futures, Kucoin, MEXC und ThreeCommas nie wieder aufgesetzt. Die Komponente meldete den Reconnect als erfolgreich, während diese Feeds still verschwunden waren. Bei BitMEX, Bitfinex, Crypto.com, Deribit und Kraken Futures lief die Wiederholung vor der Authentifizierung, was ebenfalls nicht funktionieren kann. Frames, die eine kurzlebige Anmeldeinformation tragen, werden jetzt zum Zeitpunkt der Wiederholung mit einer frischen neu aufgebaut, statt erneut gesendet zu werden.
Geldbeträge wurden gerundet, bevor sie signiert wurden. Eine feste Maske mit acht Nachkommastellen machte aus einer Größe wie 0.000000004 eine Null, und Werte konnten je nach Systemgebietsschema in wissenschaftlicher Notation oder mit einem Komma als Trennzeichen hinausgehen. Werte werden jetzt verlustfrei geschrieben, in einfacher Dezimaldarstellung, mit einem Punkt, bei Binance, Bybit, Cex, Cryptohopper, Kucoin, MEXC und ThreeCommas.
Neu im selben Bereich: eine Kraken-WebSocket-v2-Komponente neben der v1-Komponente, ein Huobi-Client, der intern eine zweite Verbindung öffnet, sodass eine Instanz öffentliche und private Daten gleichzeitig bedient, UseServerTimeOffset bei Binance für einen Host, dessen Uhr abgedriftet ist, und zwei Drosselungsoptionen, PaceBatch und AsyncResubscribe, die verhindern, dass eine große Subscription in das Ratenlimit der Börse läuft, und die Reconnect-Wiederholung auf einen Hintergrund-Worker verlagern.
sgcWebSockets .NET 2026.9.0
Die .NET-Bibliothek folgt der Delphi-Bibliothek. OnQueueDrained und PendingCount kommen mit derselben Bedeutung, zusammen mit Throttle.AsyncResubscribe, AllowUnsignedWebhooks im Cryptohopper-Client und einem neuen Ereignis OnBinanceUserStreamSubscribed, sodass die Bereitschaft des User-Data-Streams nicht mehr durch Abfragen einer Eigenschaft herausgefunden werden muss.
Jede oben aufgeführte Korrektur an Exchange-Reconnect und Signierung gilt auch hier, und ebenso die Entfernungen. Das AppRTC-Protokoll, die RTCMultiConnection-API und die Flash-Fallback-Klassen sind verschwunden, was TwsTransport neu durchnummeriert. Code, der den numerischen Transportwert gespeichert oder übertragen hat, muss überprüft werden.
Zwei Lecks, die erwähnt gehören: Eine WebSocket-API-Komponente, die freigegeben wurde, während ihr Client noch verbunden war, hat sich nie aus der Liste entfernt, die der Nachrichten-Handler durchläuft, und für jede zerstörte Komponente sind zwei Heartbeat-Timer-Threads geleckt, weshalb ein sauberes Herunterfahren gelegentlich abgestürzt ist.
sgcSign 2026.9.0
Der größte Teil dieses Releases ist aus Kundenwünschen entstanden, und er landet in drei Bereichen: zu wissen, mit welchem Zertifikat Sie gleich signieren, eine Signatur zu bauen, die ein Validator auch in zehn Jahren noch akzeptiert, und eine Signatur gegen etwas anderes als sich selbst zu prüfen.
Zertifikatslisten, aus denen Sie auswählen können
Das Aufzählen von Zertifikaten gab früher Anzeigenamen zurück, was genügt, um eine Combobox zu füllen, und nicht genügt, um eine Entscheidung zu treffen. Zwei Karten derselben Zertifizierungsstelle, ausgestellt auf dieselbe Person, sehen in dieser Liste identisch aus. Die Aufzählung trägt jetzt den SHA-1-Fingerabdruck, die Steuernummer, die Seriennummer, den Aussteller und die Gültigkeitsdaten, auf dieselbe Weise für den Windows-Zertifikatsspeicher, ein PKCS#11-Token und eine PFX-Datei.
uses
sgcSign_KeyProvider_WinCertStore, sgcSign_X509, sgcSign_Types;
var
oProvider: TsgcWindowsCertStoreProvider;
oList: TsgcX509CertificateList;
i: Integer;
begin
oProvider := TsgcWindowsCertStoreProvider.Create(nil);
Try
// only certificates that are still valid and hold a private key
oList := oProvider.EnumerateCertificateList([cfNotExpired, cfPrivateKey]);
Try
for i := 0 to oList.Count - 1 do
Memo1.Lines.Add(Format('%s | %s | %s .. %s | %s',
[oList[i].Subject, oList[i].SerialNumber,
DateToStr(oList[i].NotBefore), DateToStr(oList[i].NotAfter),
oList[i].Thumbprint]));
// and sign with exactly the one that was chosen
oProvider.SelectCertificateByThumbprint(oList[0].Thumbprint);
Finally
oList.Free;
End;
Finally
oProvider.Free;
End;
end;
Eine PKCS#11-Karte mit mehreren Slots, wie sie bei polnischen Karten für qualifizierte Signaturen üblich ist, die getrennte Zertifikate hinter getrennten PINs ablegen, lässt sich jetzt ganz ohne PIN inventarisieren. EnumerateCertificateListAllSlots liest jeden Slot, wobei jeder Eintrag festhält, woher er stammt, und TokenSlotCount meldet, wie viele Slots tatsächlich ein Token enthalten.
Zertifikate selbst melden ebenfalls alles, was sie tragen, statt nur der sieben Attribute, die der Parser früher erkannt hat, mit der Postanschrift in lesbare Zeilen dekodiert und jedem Attribut über seine OID erreichbar.
Signaturen, die prüfbar bleiben
PAdES erhält zwei Profile. spPAdESBasicT signiert mit einem eingebetteten Zeitstempel und ohne Sperrinformationen, und spPAdESDocumentArchive legt über dem Langzeitprofil einen Archivzeitstempel an, der das gesamte Dokument einschließlich seiner Sperrinformationen abdeckt, sodass die Datei prüfbar bleibt, wenn das Gültigkeitsfenster des ersten Zeitstempels abgelaufen ist.
Das ausstellende Zertifikat zu finden, war früher Ihr Problem, denn die meisten Karten für qualifizierte Signaturen tragen nur Ihr eigenes Zertifikat. Die neuen Aufrufe GetIssuerCertificate und GetCertificateChain finden das Zertifikat, das dasjenige ausgestellt hat, mit dem Sie signieren, und den gesamten Pfad darüber, wobei kryptografisch statt über den Namen abgeglichen wird, sodass eine Zertifizierungsstelle, die ihren Signaturschlüssel gewechselt hat, nicht mit ihrer Vorgängerin verwechselt wird. IssuerLookup entscheidet, wo gesucht wird: standardmäßig im Windows-Zertifikatsspeicher, in PEM- oder DER-Dateien, die Sie mitliefern, oder unter der Adresse im Zertifikat, was standardmäßig ausgeschaltet ist.
Zeitstempelanfragen können jetzt signiert werden, was einige qualifizierte Zertifizierungsstellen verlangen, insbesondere die polnischen. Setzen Sie RequestFormat auf trfCMS, weisen Sie einen Key Provider zu, und OnBeforeSendRequest und OnAfterReceiveResponse übergeben Ihnen die exakten gesendeten und empfangenen Bytes.
Prüfung mit Vertrauensankern
Das ist die Änderung, die Sie aufmerksam lesen sollten. Bisher nahm der Prüfer das Signaturzertifikat aus dem Dokument, das er prüfte, und bestätigte, dass dieser Schlüssel dieses Dokument signiert hat, was nur beweist, dass derjenige, der das Dokument geschrieben hat, auch die Signatur darin geschrieben hat.
Die neuen Eigenschaften TrustedCertificates und TrustedCertificateStore legen fest, welchen Wurzeln Sie vertrauen, und RequireTrustedChain, CheckKeyUsage und RequireCompleteRevocationCheck entscheiden, wie streng das Ergebnis ausfällt. Ein Anker wird über den SHA-256-Fingerabdruck oder durch Prüfung unter seinem eigenen Schlüssel abgeglichen, nie über den Namen. Ein Prüfer ohne Anker liefert das Urteil, das er vorher geliefert hat, aber der Bericht nach ETSI TS 119 102-2 sagt nicht mehr total-passed für eine Signatur, die nie zu einem Anker verkettet wurde, gespeicherte Berichte, die ohne Anker erzeugt wurden, müssen also neu erzeugt werden.
Die Authenticode-Signierung kann jetzt zusätzliche Zertifikate einbetten, dasselbe, was signtool /ac tut, sodass die Signatur eines Kernelmodus-Treibers über ihr Cross-Zertifikat zur Microsoft Code Verification Root verkettet werden kann.
Ein HTTP-Transport, mit Proxys
Jede Anfrage, die die Bibliothek stellt, läuft jetzt über einen Transport mit einer gemeinsamen HTTPOptions-Eigenschaft: der Zeitstempel-Client, die OCSP- und Sperrlisten-Clients, der Download der EU-Vertrauensliste und die Cloud-Key-Provider. Er trägt den Proxy, der der Systemproxy sein kann, keiner, eine explizite Adresse oder derjenige, den die Maschine je Adresse auflöst, die Anmeldedaten für einen Proxy, der danach fragt, das Client-Zertifikat, die niedrigste akzeptierte TLS-Version und den User-Agent. Jede Einstellung hat als Standard das, was diese Anfragen vorher getan haben, und ein neues Ereignis OnHTTPRequest ersetzt den Transport vollständig für ein Gateway, das diese Einstellungen nicht beschreiben können.
Der Signaturserver
API-Schlüssel und die Benutzer, die sie erstellen, sind jetzt pro Projekt isoliert, sodass ein Projektadministrator die Schlüssel im eigenen Projekt verwaltet, ohne die von anderen zu sehen. Schlüssel lassen sich aktivieren und deaktivieren, statt nur in eine Richtung widerrufen zu werden, ihr Ratenlimit und ihr Tageskontingent lassen sich nach der Erstellung bearbeiten, und das Audit-Log kann endlich nach Client-Adresse gefiltert werden, sowohl in der Konsole als auch im CSV-Export.
Eine Authenticode-Signatur kann jetzt mehr als zwei verschachtelte Signaturen mit jeweils einem anderen Zertifikat tragen, und genau das braucht es, um eine Datei auszuliefern, die von einem auslaufenden Zertifikat und seinem Nachfolger signiert ist. Windows-Katalogdateien können signiert werden, und ein neuer Endpunkt /api/v1/sign/raw signiert einen bereits berechneten Digest und gibt nur den Signaturwert zurück, was genau das ist, wonach signtool über seinen /dlib-Callback fragt. Da er jeden übergebenen Digest signiert, ist er standardmäßig ausgeschaltet und wird einzeln pro Provider eingeschaltet.
Mehrere Server-Standardwerte haben sich aus gutem Grund geändert. Die Einstellung server.listen bindet jetzt tatsächlich die Adresse, die Sie angegeben haben, Administrationsaktionen erfordern einen Formular-Post mit einem Einmal-Token, und Webhook-Zustellungen über HTTPS prüfen das Zertifikat der Adresse, an die sie gesendet werden. Alle drei stehen in den Upgrade-Hinweisen.
sgcIndy 2026.9.0
Ein kleines Release, und jeder Punkt darin ist eine Korrektur, die man haben will.
Der über ALPN vereinbarte Protokollname wurde mit vier Bytes in das eine Byte geschrieben, das OpenSSL für dessen Länge vorhält, deshalb hat jeder Handshake, der ein Protokoll ausgehandelt hat, den Speicher daneben überschrieben. Ein TLS-Server auf der IOCP- oder EPOLL-Engine hat die gesamte CPU eines Threads verbraucht, wenn die Gegenseite eine Neuaushandlung verlangte, und dabei den Schreibvorgang immer wieder wiederholt, statt zu senden, was OpenSSL bereits vorbereitet hatte. Unter Linux wurde eine TLS-Anwendung vom Betriebssystem beendet, wenn die Gegenseite die Verbindung während eines Schreibvorgangs zurücksetzte, weil OpenSSL auf eine Weise schreibt, die das System nicht bitten kann, das Broken-Pipe-Signal zu unterdrücken. Dasselbe Problem unter FPC und Lazarus ist ebenfalls behoben, einschließlich serverseitig angenommener Verbindungen unter macOS, die noch betroffen waren.
Für das Community-Setup wurden die vorkompilierten Delphi-13-Binärdateien aus den Delphi-12-Projekten erzeugt, deshalb trugen sie die 290er-Namen statt der 370er-Namen, die das Delphi-13-Installationsprogramm erwartet, und Windows ARM64EC wurde überhaupt nicht gebaut. Delphi 13 baut jetzt seine eigenen Projekte für jede unterstützte Plattform.
sgcOpenAPI 2026.9.0
Der Parser scheitert nicht mehr stillschweigend. Jedes Dokument kommt jetzt mit einer Warnings-Liste zurück, die ein fehlendes openapi- oder info-Mitglied enthält, ein Mitglied mit dem falschen JSON-Typ, eine Operation, die nicht erzeugt werden konnte, eine nicht aufgelöste Pfadelement-Referenz und jedes JSON-Schema-Schlüsselwort, das gelesen, aber noch nicht berücksichtigt wird.
uses
sgcOpenAPI_Classes, sgcOpenAPI_Parser_Client_Pascal;
var
oParser: TsgcOpenAPI_Parser_Client_Pascal;
i: Integer;
begin
oParser := TsgcOpenAPI_Parser_Client_Pascal.Create;
Try
oParser.OpenAPIClassName := 'TPetStoreClient';
oParser.OutputFileName := 'PetStoreClient.pas';
oParser.ReadFromFile('petstore.json');
for i := 0 to oParser.Warnings.Count - 1 do
Memo1.Lines.Add('warning: ' + oParser.Warnings[i]);
oParser.SaveToFile('PetStoreClient.pas');
Finally
oParser.Free;
End;
end;
Er weiß außerdem, welche Version der Spezifikation er liest, sodass ein 3.0-Dokument und ein 3.1-Dokument nicht mehr als dasselbe behandelt werden, wobei exclusiveMinimum und exclusiveMaximum der offensichtliche Fall sind. OpenAPI-3.1-Webhooks, jsonSchemaDialect, components.pathItems, der Lizenzbezeichner, das mutualTLS-Sicherheitsschema, ein als Array deklarierter Typ wie ["string","null"] und ein als Boolean deklariertes Schema werden alle unterstützt, ebenso die OpenAPI-3.2-Query-Operation und die additionalOperations-Map.
Die Generierung ist an den Stellen besser geworden, an denen sie früher aufgegeben hat. Ein Inline-Objektschema erzeugt jetzt eine eigene Klasse, statt zu einem String zu degradieren, items wird als vollständiges Schema gelesen, und der erzeugte Client unterstützt Cookie-Parameter und die vollständigen Regeln zur Parameterserialisierung: matrix, label, simple, form, spaceDelimited, pipeDelimited und deepObject, mit explode und allowReserved.
Die Kommandozeile ist endlich in einem Build-Skript brauchbar. Sie setzt einen Exit-Code, 0 bei Erfolg und 1 bis 7 für die verschiedenen Fehlerfälle, und Fehler gehen immer nach Standardfehler. Ein neuer Schalter -r konvertiert ein YAML- oder Swagger-2.0-Dokument über den öffentlichen Konverter, standardmäßig ausgeschaltet.
Dieselben OpenAPI-Verbesserungen werden auch mit sgcWebSockets ausgeliefert, wo der serverseitige Validator jetzt zusätzlich Header- und Cookie-Parameter prüft, mit ValidateHeaderParams, ValidateCookieParams und EnforceRequired.
Vor dem Upgrade
Jedes Produkt hat diesmal inkompatible Änderungen. Das sind die, die Sie am ehesten betreffen.
- Entfernt aus sgcWebSockets und .NET. AppRTC, RTCMultiConnection und der Flash-Fallback sind verschwunden. Entfernen Sie die
FallBack.Flash-Zeilen aus jeder.dfm, die sie enthält, sonst löst das Formular einen Fehler aus, dass die Eigenschaft nicht existiert, und beachten Sie, dass sich die Ordinalzahl jedesTwsTransport-Mitglieds nachtrpFlashum eins verschoben hat. WorkOpRoundRobinist verschwunden undWorkOpThreadsbindet eine Verbindung nicht mehr an einen Thread. Alles, was pro Thread gehalten wird, etwa eine Datenbankverbindung oder ein Thread-lokaler Cache, folgt nicht mehr zwangsläufig einer Verbindung.- Die Zertifikatsprüfung wird jetzt dort erzwungen, wo sie es vorher nicht wurde. Im OpenSSL-Backend bindet
TLSOptions.VerifyCertificatedas Zertifikat an den Host, so wie SChannel und Apple es bereits getan haben. Bei HTTP/3 wird das Ergebnis der Prüfung nicht mehr verworfen.DTLSOptions.VerifyCertificateerzwingt jetzt sein Ergebnis, undDTLSOptions.RootCertFileist der Truststore und nicht das eigene Zertifikat dieses Endpunkts, das inCertFilegehört. WriteTimeoutsteht in den Clients standardmäßig auf 60 Sekunden statt auf unbegrenzt, und es gilt jetzt auch unter Linux, macOS, iOS und Android, wo es vorher nur unter Windows wirksam war. Setzen Sie es negativ, damit es nie abläuft.- Wiederholungsversuche sind enger gefasst. Standardmäßig werden nur GET, HEAD und OPTIONS wiederholt, weil ein POST, das der Server bereits ausgeführt hatte, zweimal gesendet werden und eine zweite Order platzieren könnte. Fügen Sie POST zu
RetryOptions.Methodshinzu, wenn Sie sich auf das alte Verhalten verlassen haben. - sgcSign hat ein einziges
TsgcX509Certificate. Die Bibliothek deklarierte drei Klassen unter diesem Namen. Code, der Zertifikate auflistet, brauchtsgcSign_X509in seiner uses-Klausel und den passenden.hpp-Include in C++ Builder. - ASiC-E-CAdES-Container, die von früheren Versionen erstellt wurden, haben keine kryptografische Verbindung zu den Dokumenten darin, weil jeder Digest im Manifest als leeres Element geschrieben wurde. Bereits ausgegebene Container sollten neu ausgestellt werden, und Aufrufer, die ASiC-E erzeugen, müssen auf die neue
BuildCAdES-Überladung wechseln, die einen Signatur-Callback entgegennimmt. - Anmeldedaten, die im Objektinspektor eingetragen werden, werden nicht mehr in die
.dfmgeschrieben. Vierzehn Eigenschaften in elf sgcSign-Units, darunter der AWS Secret Key, das JSON des Google-Cloud-Dienstkontos und die PKCS#11-PIN, sind jetzt als nicht gespeichert markiert. Sie bleiben aus Code zuweisbar, und eine bestehende.dfmlädt weiterhin, aber der Wert verschwindet, sobald das Formular das nächste Mal gespeichert wird. - Der sgcSign Server bindet
server.listenjetzt wirklich. Eine Installation, die für 127.0.0.1 konfiguriert war und tatsächlich aus dem gesamten Netzwerk erreichbar war, wird unerreichbar, und genau das hat die Konfiguration verlangt. - Erzeugte OpenAPI-Clients prüfen das Serverzertifikat. Setzen Sie
TLSOptions.VerifyCertificatefür einen selbstsignierten Endpunkt auf False. Der Anfrage-Body ist jetzt UTF-8, ein leerer String wird als"field": ""serialisiert, und eine Antwort gibt einen vom Aufrufer geliefertenResponseStreamnicht mehr frei.
Die vollständige Liste, mit der Begründung für jeden Punkt, steht im Changelog des jeweiligen Produkts.
Wo Sie es bekommen
Release 2026.9.0 ist ab sofort verfügbar, mit vollständigem Quellcode und einem Jahr Updates, für Delphi 7 bis Delphi 13 Florence, die passenden C++ Builder-Versionen und .NET.
sgcWebSockets · sgcWebRTC · sgcCrypto · sgcHTML · sgcSign · sgcIndy · sgcOpenAPI
Testversion herunterladen · Changelog
Fragen oder Feedback? Nehmen Sie Kontakt auf, Sie erhalten eine Antwort von den Leuten, die den Code geschrieben haben.
