Zaledwie miesiąc po pierwszej premierze, sgcSign 2026.5 dostarcza znaczące rozszerzenie biblioteki. Wydanie dodaje podpisywanie Microsoft Authenticode dla binariów Windows, trzy nowe narzędzia podpisujące dystrybucję kodu (ClickOnce, NuGet, VSIX), kompletny pakiet zgodności z eIDAS UE (kontenery ASiC, lista zaufania LOTL / EUTL, zdalne podpisywanie Cloud Signature Consortium), dziewięć wstępnie dostrojonych krajowych profili zatrudnienia, bułgarski profil Peppol BIS Billing 3.0, natywny generator kodów QR, obsługę ECDSA P-256/384/521 oraz RSA-PSS, pełne integracje CI/CD oraz obszerny zestaw poprawek zgodności XAdES / PFX.
Ten wpis omawia najważniejsze nowości, z gotowymi do wklejenia fragmentami kodu Delphi dla każdego nowego komponentu.
Microsoft Authenticode
TsgcAuthenticodeSigner podpisuje pliki Windows Portable Executable (.exe, .dll, .sys) zgodnie ze specyfikacją Authenticode. Komponent parsuje plik PE, oblicza jego skrót algorytmem Authenticode (pomijając sumę kontrolną i istniejącą tablicę certyfikatów), buduje pełny blok PKCS#7 SignedData z zawartością SPC indirect data i dołącza go do tablicy certyfikatów binarium.
Obsługiwane są skróty od SHA-1 do SHA-512, znaczniki czasu RFC 3161 są osadzane jako atrybuty niepodpisane, a AppendSignature := True tworzy zagnieżdżone podpisy (np. podwójne podpisywanie SHA-1 + SHA-256 dla zgodności ze starszymi wersjami Windows).
uses
sgcSign_Authenticode, sgcSign_KeyProvider_PFX, sgcSign_TSAClient;
var
oSigner: TsgcAuthenticodeSigner;
oPFX: TsgcPFXKeyProvider;
oTSA: TsgcTSAClient;
begin
oPFX := TsgcPFXKeyProvider.Create(nil);
oPFX.FileName := 'codesign.pfx';
oPFX.Password := 'secret';
oTSA := TsgcTSAClient.Create(nil);
oTSA.URL := 'http://timestamp.digicert.com';
oSigner := TsgcAuthenticodeSigner.Create(nil);
try
oSigner.KeyProvider := oPFX;
oSigner.TSAClient := oTSA;
oSigner.Hash := ahSHA256; // ahSHA1 / ahSHA256 / ahSHA384 / ahSHA512
oSigner.Level := alT; // alBES or alT (with timestamp)
oSigner.Description := 'My Application';
oSigner.URL := 'https://www.example.com';
oSigner.SignFile('MyApp.exe', 'MyApp-signed.exe');
finally
oSigner.Free; oTSA.Free; oPFX.Free;
end;
end;
Weryfikacja jest symetryczna. TsgcAuthenticodeVerifier.Verify zwraca rekord z wynikiem, obliczonymi i osadzonymi skrótami, podmiotem/wystawcą podpisującego oraz informacją o obecności znacznika czasu:
var
oVer: TsgcAuthenticodeVerifier;
oRes: TsgcAuthenticodeVerifyResult;
begin
oVer := TsgcAuthenticodeVerifier.Create(nil);
try
oRes := oVer.Verify('MyApp-signed.exe');
if oRes.Valid then
ShowMessage('Signed by ' + oRes.SubjectName)
else
ShowMessage('Invalid: ' + oRes.ErrorMessage);
finally
oVer.Free;
end;
end;
Podpisywanie Authenticode wyłącznie na podstawie skrótu
Duże artefakty CI (instalatory, środowiska uruchomieniowe, sterowniki) sprawiają, że przesyłanie całego pliku PE do zdalnego serwera podpisującego jest uciążliwe. Nowy przepływ podpisywania wyłącznie na podstawie skrótu pozwala klientowi obliczyć skrót Authenticode lokalnie i wysłać do serwera sgcSign jedynie 32-bajtowy digest. Serwer zwraca niedołączony blok PKCS#7, a klient osadza go ponownie w binarium — skracając wysyłki wielomegabajtowe do kilku KB na agentach z ograniczoną przepustowością.
// Local: compute the hash with sgcSign_PE_Hasher, POST it to the server,
// receive the SignedData blob, then append it to the PE's certificate table.
var
oSigner: TsgcAuthenticodeSigner;
vHash, vPKCS7: TBytes;
begin
// vHash := ComputePEHash('MyApp.exe', haSHA256);
vPKCS7 := oSigner.SignHash(vHash, ahSHA256);
// EmbedPKCS7IntoPE('MyApp.exe', vPKCS7, 'MyApp-signed.exe');
end;
Ta sama operacja jest udostępniana przez punkt końcowy serwera POST /api/v1/sign/authenticode/hash, flagę CLI sgcsign sign --prehash oraz metodę TsgcSignClient.SignAuthenticodeHashAsync w pakiecie SDK .NET.
Narzędzia podpisujące ClickOnce, NuGet i VSIX
Trzy nowe komponenty obejmują ekosystem dystrybucji deweloperskiej Microsoft.
TsgcClickOnceSigner podpisuje manifesty wdrożeniowe .application oraz manifesty aplikacji .exe.manifest przy użyciu opakowującego W3C XML-DSig, odpowiadając wynikom narzędzia Microsoft mage.exe. Komponent przepisuje węzeł publisherIdentity wartością issuerKeyHash certyfikatu.
uses sgcSign_ClickOnce;
var oCO: TsgcClickOnceSigner;
begin
oCO := TsgcClickOnceSigner.Create(nil);
try
oCO.KeyProvider := oPFX;
oCO.Hash := haSHA256;
oCO.PublisherName := 'My Company';
oCO.SignManifestFile('MyApp.application', 'MyApp-signed.application');
finally
oCO.Free;
end;
end;
TsgcNuGetSigner podpisuje pakiety autorskie .nupkg, tworząc blok CMS/PKCS#7 SignedData (certyfikat podpisujący v2, typ zobowiązania "proof of origin") z opcjonalnym kontrpodpisem RFC 3161.
uses sgcSign_NuGet;
var oNu: TsgcNuGetSigner;
begin
oNu := TsgcNuGetSigner.Create(nil);
try
oNu.KeyProvider := oPFX;
oNu.TSAClient := oTSA;
oNu.Hash := haSHA256;
oNu.SignPackageFile('MyLib.1.0.0.nupkg', 'MyLib.1.0.0.signed.nupkg');
finally
oNu.Free;
end;
end;
TsgcVSIXSigner implementuje podpisy cyfrowe OPC (Open Packaging Convention) dla rozszerzeń Visual Studio, obliczając referencje XML-DSig dla poszczególnych części i przepisując [Content_Types].xml oraz _rels/.rels pakietu.
uses sgcSign_VSIX;
var oVX: TsgcVSIXSigner;
begin
oVX := TsgcVSIXSigner.Create(nil);
try
oVX.KeyProvider := oPFX;
oVX.Hash := haSHA256;
oVX.SignPackageFile('MyExt.vsix', 'MyExt-signed.vsix');
finally
oVX.Free;
end;
end;
Wszystkie trzy ponownie używają tego samego interfejsu IsgcKeyProvider co istniejące komponenty XAdES / PAdES / CAdES, więc AWS KMS, Azure Trusted Signing lub token PKCS#11 skonfigurowany do podpisywania faktur można wykorzystać do podpisywania binariów bez dodatkowych zmian.
Pakiet eIDAS UE / zgodności
To wydanie wprowadza pakiet eIDAS — trzy nowe moduły, które razem pozwalają aplikacji Delphi zweryfikować podpis względem oficjalnych ram zaufania UE oraz tworzyć długoterminowe kontenery archiwizacyjne.
Kontenery ASiC (ETSI EN 319 162-1)
sgcSign_ASiC buduje i parsuje kontenery ASiC-S (pojedynczy dokument) oraz ASiC-E (wiele dokumentów) w wariantach XAdES i CAdES. Wynikiem jest deterministyczny plik ZIP z wpisem mimetype na pierwszym miejscu i podpisem umieszczonym w META-INF/.
uses sgcSign_ASiC;
var
oDocs: TsgcASiCDocumentArray;
vBytes: TBytes;
begin
SetLength(oDocs, 1);
oDocs[0].Name := 'invoice.xml';
oDocs[0].Data := TFile.ReadAllBytes('invoice.xml');
// aSignatureXML comes from TsgcXAdESSigner (detached signature over the doc)
vBytes := TsgcASiCContainer.BuildXAdES(apASiCE, oDocs, vXAdESSignature);
TFile.WriteAllBytes('invoice.asice', vBytes);
end;
Lista zaufania LOTL / EUTL
sgcSign_TrustList pobiera unijną Listę List Zaufanych (List of Trusted Lists), podąża za wskaźnikami list zaufania poszczególnych państw członkowskich i parsuje każdy wpis TSPService. Wynikiem jest katalog w pamięci zawierający około 3600 usług z 31 państw członkowskich. Operacja IsQualifiedAtTime klasyfikuje dowolny certyfikat jako "wystawiony przez kwalifikowanego TSP" w danym momencie podpisywania — to operacja niezbędna do podniesienia podpisu z zaawansowanego (AdES) do kwalifikowanego (QES) zgodnie z artykułem 25 eIDAS.
Cloud Signature Consortium (CSC v2)
TsgcCSCKeyProvider to implementacja interfejsu IsgcKeyProvider dla API Cloud Signature Consortium v2 — europejskiego standardu zdalnego podpisywania kwalifikowanego używanego przez Buypass, Certinomis, Globalsign EU, InfoCert, Namirial, Trust Pro i innych dostawców QTSP. Komponent obsługuje uwierzytelnianie Basic / OAuth2 / OTP, listuje poświadczenia użytkownika, pobiera łańcuch certyfikatów i wykonuje zdalne podpisywanie wyłącznie na podstawie skrótu, używając autoryzacji SAD.
uses sgcSign_KeyProvider_CSC, sgcSign_XAdES;
var oCSC: TsgcCSCKeyProvider; oX: TsgcXAdESSigner;
begin
oCSC := TsgcCSCKeyProvider.Create(nil);
oCSC.BaseURL := 'https://csc.example-qtsp.eu/csc/v2';
oCSC.AuthMethod := cscOAuth2;
oCSC.OAuthClientID := 'my-client-id';
oCSC.OAuthClientSecret := 'my-client-secret';
oCSC.CredentialID := oCSC.ListCredentials[0];
oCSC.PIN := '1234';
oCSC.OTP := '987654'; // pushed via SMS / app
oCSC.LoadCredentialInfo;
oX := TsgcXAdESSigner.Create(nil);
oX.KeyProvider := oCSC;
oX.Profile := spEIDAS;
oX.SignXML(vXML);
end;
Dziewięć profili zatrudnienia
Dziewięć wstępnie dostrojonych profili obsługuje europejskie dokumenty prawa pracy (umowy o pracę, paski wynagrodzeń, umowy o przeniesieniu):
| Profil | Kraj | Poziom | C14N | TSA | OCSP |
|---|---|---|---|---|---|
spEmploymentDE | Niemcy | B-LT | Exclusive | Tak | Tak |
spEmploymentIT | Włochy | B-LT | C14N 1.0 | Tak | Tak |
spEmploymentES | Hiszpania | B-T | Exclusive | Tak | Nie |
spEmploymentFR | Francja | B-T | Exclusive | Tak | Nie |
spEmploymentPL | Polska | B-T | Exclusive | Tak | Nie |
spEmploymentAT | Austria | B-LT | Exclusive | Tak | Tak |
spEmploymentBE | Belgia | B-LT | Exclusive | Tak | Tak |
spEmploymentPT | Portugalia | B-LT | Exclusive | Tak | Tak |
spEmploymentNL | Holandia | B-T | Exclusive | Tak | Nie |
Nowe demo EU_Employment dostarcza kompletny przepływ (podpis → pakiet ASiC-E → weryfikacja LOTL → klasyfikacja QTSP).
Bułgarski profil Peppol BIS Billing 3.0
Nowy profil TsgcProfilePeppolBG podpisuje bułgarskie faktury UBL 2.1 (waluta BGN, 20% VAT, BG VAT / EIK, BG IBAN, punkt końcowy schemat ID 9926) na poziomie XAdES B-T z exclusive C14N. Wersje demo dla Delphi i C++Builder zawierają w pełni wypełniony szablon faktury.
uses sgcSign_XAdES, sgcSign_Types;
var oSigner: TsgcXAdESSigner;
begin
oSigner := TsgcXAdESSigner.Create(nil);
try
oSigner.KeyProvider := oPFX;
oSigner.TSAClient := oTSA;
oSigner.Profile := spPeppolBG;
oSigner.SignXMLFile('invoice_bg.xml', 'invoice_bg_signed.xml');
finally
oSigner.Free;
end;
end;
Integracje CI/CD
Serwer sgcSign udostępnia teraz pierwszorzędne artefakty dla każdego popularnego potoku:
- GitHub Actions — złożona akcja z podpisywaniem Authenticode wyłącznie na podstawie skrótu.
- Azure DevOps — natywne zadanie z integracją z plikami bezpiecznymi.
- Jenkins — deklaratywny DSL potoku plus biblioteka współdzielona.
- Docker — obraz Windows Server Core plus plik
docker-compose. - Helm — chart Kubernetes dla serwera sgcSign w trybie wysokiej dostępności.
Generator kodów QR
Dla profili TicketBAI, VeriFactu i podobnych, które wymagają kodu QR na wydrukowanej fakturze, nowy moduł sgcSign_QRCode dostarcza generator napisany w czystym Pascalu, implementujący ISO/IEC 18004 w trybie bajtowym — wszystkie cztery poziomy ECC, wersje od 1 do 40, GF(256) Reed-Solomon, pełną punktację kar masek — z rendererem TBitmap. Bez zewnętrznych bibliotek DLL, bez niespodzianek licencyjnych.
uses sgcSign_QRCode, Graphics;
var
oMatrix: TQRMatrix;
oBmp: TBitmap;
begin
oMatrix := GenerateQRCode(
'https://tbai.eus/QURL/123456789-A?cr=42',
qrECM);
oBmp := TBitmap.Create;
try
RenderQRMatrix(oMatrix, oBmp, 5, 4); // 5 px / module, 4-module border
oBmp.SaveToFile('invoice_qr.bmp');
finally
oBmp.Free;
end;
end;
ECDSA P-256 / P-384 / P-521 oraz RSA-PSS
TsgcPEMKeyProvider potrafi teraz importować klucze prywatne EC poprzez Windows BCrypt CNG (ECCPRIVATEBLOB) i podpisywać z surowym wyjściem r||s dla XML-DSig. Nowa metoda SignDataPSS tworzy podpisy RSA-PSS (SHA-256, sól = 32 bajty) przy użyciu BCRYPT_PAD_PSS — wymagane przez coraz większą liczbę krajowych profili e-fakturowania.
Po stronie weryfikacji TsgcSignatureVerifier importuje klucze publiczne EC z BCRYPT_ECCPUBLIC_BLOB i waliduje podpisy ECDSA dla tych samych trzech krzywych zarówno w ścieżce XAdES SignatureValue, jak i w surowej ścieżce VerifyData.
Aby to umożliwić, TsgcX509Certificate parsuje teraz rozszerzenie KeyUsage i udostępnia je poprzez właściwość KeyUsage oraz pomocnicze metody HasKeyUsageDigitalSignature / HasKeyUsageNonRepudiation, a nowa właściwość PublicKeyParameters udostępnia surowe parametry AlgorithmIdentifier TLV (OID nazwanej krzywej dla certyfikatów EC).
Przeciążenia WideString dla Delphi 7
Dla wywołań przekazujących tekst spoza ACP (polski KSeF, grecki myDATA, bułgarski Peppol itp.) publiczne API podpisywania i weryfikacji udostępnia teraz przeciążenia WideString dla TsgcXAdESSigner.SignXML, SignXMLDetached, SignXMLEnveloping (oraz odpowiednich metod w TsgcDocumentSigner i TsgcSignatureVerifier). Gwarantuje to bezstratny Unicode wejście/wyjście w Delphi 7 — bez konwersji przez ACP — i jest równoważne przeciążeniom string dostępnym w Delphi 2009+.
Poprawki zgodności i niezawodności
Zestaw poprawek błędów w wersji 2026.5 zamyka długą listę problemów XAdES / PFX / weryfikatora wykrytych podczas pracy z rzeczywistymi punktami końcowymi organów podatkowych.
TsgcDocumentSignertworzy teraz poprawnie XAdES dla profili AdES. Wewnętrznie deleguje doTsgcXAdESSignerdla ścieżkisfXAdESi zgłasza jasny błąd dlasfPAdES/sfCAdES(należy używać dedykowanych komponentów). Nowa publikowana właściwośćFormat: TsgcSignatureFormat(domyślniesfXAdES) czyni wybór jednoznacznym. Poprzednie wersje emitowały zwykły XML-DSig niezależnie od profilu, co było odrzucane przez krajowe usługi e-fakturowania.TsgcPFXKeyProviderzyskuje nową publikowaną właściwośćHashAlgorithm(domyślniehaSHA256), aTsgcXAdESSignerprzekazuje teraz skrót aktywnego profilu do dostawców PFX. Faktury z profilu FacturaeB2B podpisane kluczem PFX są teraz prawidłowo RSA-SHA1, co naprawia odrzucenie FACe INVALID_INVOICE-122 «los datos de la firma no son correctos».TsgcPFXKeyProviderobsługuje teraz nowoczesne pliki P12:PKCS12_PREFER_CNG_KSP, wieloprób iterowania po wielu certyfikatach, dwuetapowe pobieranie (ONLY_NCRYPT, następniePREFER_NCRYPT) oraz podpisywanie CNG poprzezNCryptSignHash.- Zgodność XAdES KSeF / ETSI — opakowanie V1
SigningCertificate, warunkowe emitowanieSignaturePolicyIdentifier, dziesiętnyX509SerialNumber, pojedyncze budowanieSignedProperties(poprawka wyścigu zegara), jawne przekształcenia exc-c14n na referencjiSignedPropertiesoraz nowa właściwośćSignatureParentElement.TsgcSignatureVerifierrozwiązuje terazURI=#<Id>przez wyszukiwanie po Id elementu. - Parsowanie rozszerzeń X.509 — zawartość tagu v3
[3] EXPLICIT Extensionsbyła podwójnie opakowywana, milcząco pomijającKeyUsage,ExtendedKeyUsage, AIA, CDP, SubjectAltName i BasicConstraints dla każdego certyfikatu. Naprawione. - Samozamykające się znaczniki XML —
ExtractFullElementobsługuje teraz poprawnie<ds:DigestMethod Algorithm="…/sha1"/>. Poprzednie wersje domyślnie przyjmowały SHA-256, co powodowało błędy weryfikacji FacturaeB2B z komunikatem "Digest length mismatch for Reference 0". - Awaryjne inclusive C14N —
TsgcSignatureVerifierstosuje niejawne inclusive C14N do referencji fragmentów / pustych URI, które pomijają jawne przekształcenie, zgodnie z XML-DSig §4.3.3.2. Naprawia "Digest value mismatch" w referencjach KeyInfo i body w profilach inclusive-C14N (FacturaeB2B). - Wzmocnienie PEM — poprawka Unicode
ReadFileContent, dwustopniowe dekodowanie PKCS#8, keyspecAT_KEYEXCHANGE, kontener CSP z sufiksem GUID, natywne zaszyfrowane PKCS#8 (PBES2 / PBKDF2 / AES-CBC) przez BCrypt,LoadCertificateOnlyoraz rozpoznawanie markerów EC. - Porządkowanie w czasie projektowania — wszystkie dziewięć komponentów podpisujących / weryfikujących automatycznie czyści powiązane referencje poprzez
Notification(opRemove), eliminując zwisające wskaźniki, gdy dostawca klucza lub klient TSA zostanie usunięty z formularza. - Higiena kompilacji — ostrzeżenie W1000 (UTF8Decode) w
sgcSign_ASiCnaprawione poprzez awaryjne{$IFDEF UNICODE} UTF8ToString; ostrzeżenia H2077 / H2219 dotyczące martwego kodu uporządkowane wsgcSign_XAdESisgcSign_TrustList.
Aktualizacja
2026.5 jest aktualizacją typu drop-in dla istniejących projektów 2026.4. Jedyną zmianą zachowania, na którą warto zwrócić uwagę, jest TsgcDocumentSigner: kod, który polegał na emitowaniu zwykłego XML-DSig dla profili AdES, będzie teraz poprawnie tworzył XAdES — właśnie tego wymagały organy podatkowe, ale jeśli twój test integracyjny był przypięty do starszego wyjścia, konieczne będzie odświeżenie plików referencyjnych.
Klienci z aktywną subskrypcją mogą pobrać nową kompilację z obszaru klienta. Użytkownicy wersji próbnej mogą pobrać zaktualizowany instalator pod adresem esegece.com/products/sgcsign/sgcsign-download.
Pytania, opinie lub pomoc w migracji? Skontaktuj się z nami — otrzymasz odpowiedź od osób, które napisały ten kod.
