İlk lansmandan yalnızca bir ay sonra, sgcSign 2026.5 kütüphanenin büyük bir genişlemesiyle geliyor. Bu sürüm; Windows ikili dosyaları için Microsoft Authenticode imzalamayı, üç yeni kod dağıtım imzalayıcısını (ClickOnce, NuGet, VSIX), eksiksiz bir EU eIDAS uyumluluk paketini (ASiC kapsayıcıları, LOTL / EUTL güven listesi, Cloud Signature Consortium uzaktan imzalama), dokuz önceden ayarlanmış ülke istihdam profilini, bir Bulgaristan Peppol BIS Billing 3.0 profilini, yerel bir QR Kodu üretecini, ECDSA P-256/384/521 ve RSA-PSS desteğini, tam CI/CD entegrasyonlarını ve kapsamlı bir XAdES / PFX uyumluluk düzeltmeleri kümesini ekler.
Bu yazı, öne çıkan özellikleri her yeni bileşen için kullanıma hazır Delphi kod parçacıklarıyla adım adım anlatır.
Microsoft Authenticode
TsgcAuthenticodeSigner, Windows Portable Executable dosyalarını (.exe, .dll, .sys) Authenticode spesifikasyonuna göre imzalar. İmzalayıcı, PE'yi ayrıştırır, Authenticode algoritmasıyla hashler (sağlama toplamını ve mevcut sertifika tablosunu atlayarak), SPC dolaylı veri içeriğiyle tam bir PKCS#7 SignedData blob'u oluşturur ve bunu ikili dosyanın sertifika tablosuna ekler.
SHA-1'den SHA-512'ye kadar hash'ler desteklenir, RFC 3161 zaman damgaları imzasız öznitelikler olarak gömülür ve AppendSignature := True iç içe imzalar üretir (örneğin eski Windows uyumluluğu için SHA-1 + SHA-256 çift imzalama).
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;
Doğrulama simetriktir. TsgcAuthenticodeVerifier.Verify; sonucu, hesaplanan ve gömülü hash'leri, imzalayan subject/issuer bilgisini ve bir zaman damgasının bulunup bulunmadığını içeren bir kayıt döndürür:
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;
Yalnızca hash ile Authenticode imzalama
Büyük CI yapıtları (yükleyiciler, çalışma zamanları, sürücüler) tam PE'yi uzak bir imzalayıcıya yüklemeyi zahmetli hale getirir. Yeni yalnızca hash ile imzalama akışı, istemcinin Authenticode hash'ini yerel olarak hesaplamasına ve sgcSign Sunucusuna yalnızca 32 baytlık özeti göndermesine olanak tanır. Sunucu, ekli olmayan PKCS#7 blob'unu döndürür ve istemci bunu tekrar ikili dosyaya gömer; bu da bant genişliği kısıtlı aracılarda çok megabaytlık yüklemeleri birkaç KB'ye düşürür.
// 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;
Aynı işlem, sunucunun POST /api/v1/sign/authenticode/hash uç noktası, sgcsign sign --prehash CLI bayrağı ve .NET SDK'sındaki TsgcSignClient.SignAuthenticodeHashAsync metodu tarafından sunulur.
ClickOnce, NuGet ve VSIX imzalayıcıları
Üç yeni imzalayıcı, Microsoft geliştirici dağıtım ekosistemini kapsar.
TsgcClickOnceSigner, .application dağıtım bildirimlerini ve .exe.manifest uygulama bildirimlerini, Microsoft mage.exe çıktısıyla eşleşecek şekilde enveloped W3C XML-DSig kullanarak imzalar. İmzalayıcı, publisherIdentity düğümünü sertifikanın issuerKeyHash değeriyle yeniden yazar.
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, .nupkg author paketlerini imzalar ve isteğe bağlı bir RFC 3161 karşı imzasıyla bir CMS/PKCS#7 SignedData blob'u (signing certificate v2, commitment-type "proof of origin") üretir.
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, Visual Studio uzantıları için OPC (Open Packaging Convention) dijital imzalarını uygular; parça başına XML-DSig referanslarını hesaplar ve [Content_Types].xml ile paketin _rels/.rels dosyasını yeniden yazar.
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;
Üçü de mevcut XAdES / PAdES / CAdES imzalayıcılarıyla aynı IsgcKeyProvider arabirimini yeniden kullanır; böylece fatura imzalama için yapılandırılmış bir AWS KMS, Azure Trusted Signing veya PKCS#11 belirteci, hiçbir ek altyapı olmadan ikili dosya imzalama için yeniden kullanılabilir.
EU eIDAS / uyumluluk paketi
Bu sürüm, eIDAS paketini sunar; birlikte, bir Delphi uygulamasının bir imzayı resmi EU güven çerçevesine karşı doğrulamasına ve uzun vadeli arşivleme kapsayıcıları üretmesine olanak tanıyan üç yeni birim.
ASiC kapsayıcıları (ETSI EN 319 162-1)
sgcSign_ASiC, hem XAdES hem de CAdES türlerinde ASiC-S (tek belge) ve ASiC-E (birden çok belge) kapsayıcıları oluşturur ve ayrıştırır. Çıktı, mimetype girişi en başta olan ve imzanın META-INF/ altına yerleştirildiği deterministik bir ZIP'tir.
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;
LOTL / EUTL güven listesi
sgcSign_TrustList, EU List of Trusted Lists'i indirir, Üye Devlet başına güven listesi işaretçilerini izler ve her TSPService girişini ayrıştırır. Sonuç, 31 Üye Devlet genelinde yaklaşık 3.600 hizmetten oluşan bellek içi bir kataloğdur. IsQualifiedAtTime araması, herhangi bir sertifikayı belirli bir imzalama anında "Nitelikli bir TSP tarafından düzenlenmiş" olarak sınıflandırır; bu, eIDAS Madde 25 kapsamında bir imzayı gelişmiş (AdES) seviyesinden nitelikli (QES) seviyesine yükseltmek için gereken işlemdir.
Cloud Signature Consortium (CSC v2)
TsgcCSCKeyProvider, Cloud Signature Consortium API v2 için bir IsgcKeyProvider uygulamasıdır; bu, Buypass, Certinomis, Globalsign EU, InfoCert, Namirial, Trust Pro ve diğer QTSP'ler tarafından kullanılan uzaktan nitelikli imzalama için Avrupa standardıdır. Sağlayıcı; Basic / OAuth2 / OTP kimlik doğrulamasını işler, kullanıcının kimlik bilgilerini listeler, sertifika zincirini getirir ve SAD yetkilendirmesi kullanarak yalnızca hash ile uzaktan imzalama gerçekleştirir.
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;
Dokuz istihdam profili
Dokuz önceden ayarlanmış profil, Avrupa iş hukuku belgelerini (iş sözleşmeleri, maaş bordroları, devir anlaşmaları) hedefler:
| Profil | Ülke | Seviye | C14N | TSA | OCSP |
|---|---|---|---|---|---|
spEmploymentDE | Almanya | B-LT | Exclusive | Yes | Yes |
spEmploymentIT | İtalya | B-LT | C14N 1.0 | Yes | Yes |
spEmploymentES | İspanya | B-T | Exclusive | Yes | No |
spEmploymentFR | Fransa | B-T | Exclusive | Yes | No |
spEmploymentPL | Polonya | B-T | Exclusive | Yes | No |
spEmploymentAT | Avusturya | B-LT | Exclusive | Yes | Yes |
spEmploymentBE | Belçika | B-LT | Exclusive | Yes | Yes |
spEmploymentPT | Portekiz | B-LT | Exclusive | Yes | Yes |
spEmploymentNL | Hollanda | B-T | Exclusive | Yes | No |
Yeni bir EU_Employment demosu, tüm hattı sunar (imzalama → ASiC-E paketi → LOTL doğrulaması → QTSP sınıflandırması).
Bulgaristan Peppol BIS Billing 3.0
Yeni TsgcProfilePeppolBG profili, Bulgaristan UBL 2.1 faturalarını (BGN para birimi, %20 KDV, BG VAT / EIK, BG IBAN, scheme ID 9926 uç noktası) exclusive C14N ile XAdES B-T seviyesinde imzalar. Delphi ve C++Builder demoları, tamamen doldurulmuş bir fatura şablonu sunar.
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;
CI/CD entegrasyonları
sgcSign Server artık her yaygın hat için birinci sınıf yapıtlar sunuyor:
- GitHub Actions — yalnızca hash ile Authenticode imzalama içeren bileşik Action.
- Azure DevOps — güvenli dosya entegrasyonu içeren yerel görev.
- Jenkins — bildirimsel pipeline DSL ve paylaşılan kütüphane.
- Docker — Windows Server Core imajı ve bir
docker-composedosyası. - Helm — yüksek kullanılabilirlikli sgcSign Server için Kubernetes chart'ı.
QR Kodu üreteci
Yazdırılabilir faturada bir QR kodu gerektiren TicketBAI, VeriFactu ve benzeri profiller için, yeni sgcSign_QRCode birimi, byte modunda ISO/IEC 18004'ü uygulayan saf Pascal bir üreteç sunar; dört ECC seviyesinin tümü, 1'den 40'a kadar sürümler, GF(256) Reed-Solomon, tam mask-penalty puanlaması ve bir TBitmap oluşturucusuyla birlikte. Harici DLL yok, lisanslama sürprizleri yok.
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 ve RSA-PSS
TsgcPEMKeyProvider artık EC özel anahtarlarını Windows BCrypt CNG (ECCPRIVATEBLOB) aracılığıyla içe aktarır ve XML-DSig için ham r||s çıktısıyla imzalar. Yeni bir SignDataPSS metodu, BCRYPT_PAD_PSS kullanarak RSA-PSS imzaları (SHA-256, salt = 32 bayt) üretir; bu, giderek artan sayıda ulusal e-fatura profili tarafından gerekli kılınır.
Doğrulama tarafında, TsgcSignatureVerifier, EC ortak anahtarlarını BCRYPT_ECCPUBLIC_BLOB kaynağından içe aktarır ve hem XAdES SignatureValue hem de ham VerifyData kod yollarında aynı üç eğri için ECDSA imzalarını doğrular.
Bunun çalışması için, TsgcX509Certificate artık KeyUsage uzantısını ayrıştırır ve bunu KeyUsage özelliği ile HasKeyUsageDigitalSignature / HasKeyUsageNonRepudiation yardımcıları aracılığıyla sunar; ayrıca yeni PublicKeyParameters özelliği, ham AlgorithmIdentifier parametreleri TLV'sini (EC sertifikaları için named-curve OID değeri) sunar.
Delphi 7 için WideString aşırı yüklemeleri
ACP olmayan metin geçiren çağıranlar için (Polonya KSeF, Yunanistan myDATA, Bulgaristan Peppol vb.), genel imzalama ve doğrulama API'si artık TsgcXAdESSigner.SignXML, SignXMLDetached, SignXMLEnveloping üzerinde (ve TsgcDocumentSigner ile TsgcSignatureVerifier üzerindeki eşleşen metotlarda) WideString aşırı yüklemeleri sunar. Bu, Delphi 7'de kayıpsız Unicode giriş/çıkışını garanti eder (ACP gidiş dönüşü yok) ve Delphi 2009+ üzerindeki string aşırı yüklemelerine eşdeğerdir.
Uyumluluk ve güvenilirlik düzeltmeleri
2026.5'teki hata düzeltme grubu, canlı vergi otoritesi uç noktalarına karşı ortaya çıkarılan uzun bir XAdES / PFX / doğrulayıcı sorunları listesini kapatır.
TsgcDocumentSignerartık AdES profilleri için doğru şekilde XAdES üretir. Dahili olaraksfXAdESyolu içinTsgcXAdESSignerbileşenine devreder vesfPAdES/sfCAdESiçin açık bir hata oluşturur (özel imzalayıcıları kullanın). Yeni yayınlanan birFormat: TsgcSignatureFormatözelliği (varsayılansfXAdES) seçimi açık hale getirir. Önceki sürümler, profilden bağımsız olarak düz XML-DSig üretiyordu ve ulusal e-fatura hizmetleri bunu reddediyordu.TsgcPFXKeyProvider, yeni yayınlanan birHashAlgorithmözelliği kazanır (varsayılanhaSHA256) veTsgcXAdESSignerartık etkin profilin hash değerini PFX sağlayıcılarına iletir. FacturaeB2B ile imzalanan, PFX destekli faturalar artık doğru şekilde RSA-SHA1'dir; bu da FACe INVALID_INVOICE-122 «los datos de la firma no son correctos» reddini giderir.TsgcPFXKeyProviderartık modern P12 dosyalarını destekler:PKCS12_PREFER_CNG_KSP, çoklu sertifika yineleyip-yoklama, iki aşamalı edinme (ONLY_NCRYPTardındanPREFER_NCRYPT) veNCryptSignHasharacılığıyla CNG imzalama.- XAdES KSeF / ETSI uyumluluğu — V1
SigningCertificatesarmalayıcısı, koşulluSignaturePolicyIdentifierüretimi, ondalıkX509SerialNumber, tek seferde oluşturulanSignedProperties(saat yarışı düzeltmesi),SignedPropertiesreferansında açık exc-c14n dönüşümleri ve yeni birSignatureParentElementözelliği.TsgcSignatureVerifierartıkURI=#<Id>değerini element-Id araması yoluyla çözümler. - X.509 uzantı ayrıştırması — v3
[3] EXPLICIT Extensionsetiketi içeriği iki kez sarmalanıyordu ve her sertifikadaKeyUsage,ExtendedKeyUsage, AIA, CDP, SubjectAltName ve BasicConstraints sessizce atlanıyordu. Düzeltildi. - Kendiliğinden kapanan XML etiketleri —
ExtractFullElementartık<ds:DigestMethod Algorithm="…/sha1"/>ifadesini doğru şekilde işler. Önceki sürümler varsayılan olarak SHA-256 kullanıyordu ve FacturaeB2B doğrulamasını "Digest length mismatch for Reference 0" ile bozuyordu. - Inclusive C14N geri dönüşü —
TsgcSignatureVerifier, XML-DSig §4.3.3.2 uyarınca açık bir dönüşümü atlayan fragment / boş URI referanslarına örtük inclusive C14N uygular. Inclusive-C14N profillerinde (FacturaeB2B) KeyInfo ve gövde referanslarındaki "Digest value mismatch" sorununu giderir. - PEM sağlamlaştırma — Unicode
ReadFileContentdüzeltmesi, iki adımlı PKCS#8 çözme,AT_KEYEXCHANGEkeyspec'i, GUID son ekli CSP kapsayıcısı, BCrypt aracılığıyla yerel şifrelenmiş PKCS#8 (PBES2 / PBKDF2 / AES-CBC),LoadCertificateOnlyve EC işaretçisi tanıma. - Tasarım zamanı düzenlemesi — dokuz imzalayıcı / doğrulayıcı bileşeninin tümü artık bağlı referansları
Notification(opRemove)aracılığıyla otomatik olarak temizler; böylece bir anahtar sağlayıcı veya TSA istemcisi formdan silindiğinde başıboş işaretçiler ortadan kalkar. - Derleme hijyeni —
sgcSign_ASiCiçindeki W1000 (UTF8Decode), bir{$IFDEF UNICODE} UTF8ToStringgeri dönüşüyle düzeltildi;sgcSign_XAdESvesgcSign_TrustListiçindeki H2077 / H2219 ölü kod uyarıları temizlendi.
Yükseltme
2026.5, mevcut 2026.4 projeleri için yerine doğrudan konabilen bir yükseltmedir. Dikkat edilmesi gereken tek davranışsal değişiklik TsgcDocumentSigner ile ilgilidir: AdES profilleri için düz XML-DSig üretmesine dayanan kod artık doğru şekilde XAdES üretir; vergi otoritelerinin istediği budur, ancak entegrasyon testiniz eski çıktıya sabitlenmişse golden dosyaları yenilemeniz gerekir.
Etkin aboneliği olan müşteriler yeni derlemeyi müşteri alanından indirebilir. Deneme kullanıcıları, güncellenmiş yükleyiciyi esegece.com/products/sgcsign/sgcsign-download adresinden edinebilir.
Sorularınız, geri bildiriminiz veya geçiş yardımı mı gerekiyor? Bize ulaşın — kodu yazan kişilerden bir yanıt alacaksınız.
