sgcSign 2026.5 — Authenticode, pakiet eIDAS UE i 9 profili zatrudnienia

· Wydania

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):

ProfilKrajPoziomC14NTSAOCSP
spEmploymentDENiemcyB-LTExclusiveTakTak
spEmploymentITWłochyB-LTC14N 1.0TakTak
spEmploymentESHiszpaniaB-TExclusiveTakNie
spEmploymentFRFrancjaB-TExclusiveTakNie
spEmploymentPLPolskaB-TExclusiveTakNie
spEmploymentATAustriaB-LTExclusiveTakTak
spEmploymentBEBelgiaB-LTExclusiveTakTak
spEmploymentPTPortugaliaB-LTExclusiveTakTak
spEmploymentNLHolandiaB-TExclusiveTakNie

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:

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.

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.