sgcSign 2026.9.0 büyük bir sürüm. Büyük bölümü müşteri taleplerinden doğdu ve üç alanda karşılık buluyor: hangi sertifikayla imzalamak üzere olduğunuzu bilmek, bir doğrulayıcının on yıl sonra da kabul edeceği bir imza oluşturmak ve bir imzayı kendisinden başka bir şeye karşı doğrulamak.
Bu yazı, yeni özellikleri her biri için Delphi koduyla birlikte adım adım anlatıyor. Sonda ayrıca, önceki sürümlerle üretilmiş ve yeniden üretilmesi gereken imzalar üzerine kısa bir bölüm var.
Aralarından Seçim Yapabileceğiniz Sertifika Listeleri
Sertifikaları listelemek eskiden görünen adlardan oluşan bir liste döndürüyordu, bu bir combo box'ı doldurmaya yeter, karar vermeye yetmez. Aynı makamdan gelen, aynı kişiye verilmiş iki kart o listede birbirinin aynısı görünür.
Listeleme artık SHA-1 parmak izini, mali kimlik numarasını, seri numarasını, düzenleyeni ve geçerlilik tarihlerini taşıyor ve Windows sertifika deposu, bir PKCS#11 token'ı ve bir PFX dosyası için aynı şekilde çalışıyor. Süresi dolmuş sertifikalar ve özel anahtarı olmayan sertifikalar filtrelenebiliyor. Parmak izi doğrudan SelectCertificateByThumbprint çağrısına gider, böylece kullanıcının seçtiği sertifika imzalayan sertifikadır.
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 | %s',
[oList[i].Subject, oList[i].NIF, 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;
Parametresiz çağrı değişmedi, dolayısıyla mevcut kod çalışmaya devam ediyor.
Çok Yuvalı Kartların PIN Olmadan Envanterlenmesi
Nitelikli bir imza kartı çoğu zaman birden fazla sertifika taşır, her biri kendi PIN'inin arkasındadır. Polonya kartları yaygın örnektir, iki profilli bir Certum kartı ya da üç kapsayıcılı bir PWPW Sigillum kartı. Sırf bir liste göstermek için kullanıcıdan üç PIN istemek işe yarar bir arayüz değildir.
Bir PKCS#11 token'ı artık hiç oturum açmadan envanterlenebiliyor. TokenSlotCount kaç yuvanın gerçekten bir token barındırdığını bildirir, ele alınmaya değer aralık budur ve her kayıt hangi yuvadan ve hangi token etiketinden geldiğini tutar, böylece doğru PIN yalnızca o sertifika seçildiğinde istenebilir.
uses
sgcSign_KeyProvider_PKCS11, sgcSign_X509, sgcSign_Types;
var
oPKCS11: TsgcPKCS11Provider;
oList: TsgcX509CertificateList;
i: Integer;
begin
oPKCS11 := TsgcPKCS11Provider.Create(nil);
Try
oPKCS11.LibraryPath := 'C:\Windows\System32\cryptoCertum3PKCS.dll';
ShowMessage(Format('%d slots hold a token', [oPKCS11.TokenSlotCount]));
// walks every slot that holds a token, never logs in, never needs a PIN
oList := oPKCS11.EnumerateCertificateListAllSlots([cfNotExpired]);
Try
for i := 0 to oList.Count - 1 do
Memo1.Lines.Add(Format('slot %d (%s): %s',
[oList[i].SlotIndex, oList[i].TokenLabel, oList[i].Subject]));
Finally
oList.Free;
End;
Finally
oPKCS11.Free;
End;
end;
Sizinkini Düzenleyen Sertifikayı Bulmak
Uzun vadeli imza profilleri düzenleyen sertifikaya ihtiyaç duyar, nitelikli imza kartlarının çoğu ise yalnızca sizinkini taşır. Her anahtar sağlayıcısındaki iki yeni çağrı onu bulur: GetIssuerCertificate imzalamakta olduğunuz sertifikayı düzenleyen sertifikayı döndürür, GetCertificateChain ise onun üzerindeki tüm yolu döndürür. Eşleşme adla değil kriptografik olarak denetlenir, böylece imzalama anahtarını yenilemiş bir makam kendinden önceki haliyle karıştırılmaz.
Nerede aranacağı bir karardır, bu yüzden bir özelliktir. Varsayılan olarak Windows sertifika deposu aranır, iluLocalStore uygulamanızla birlikte dağıttığınız PEM veya DER dosyalarını arar, iluAIA ise sertifikayı kendi sertifikanızın içindeki adresten indirir, bu seçenek ağa çıktığı için varsayılan olarak kapalıdır.
uses
sgcSign_Classes, sgcSign_X509;
var
vIssuerDER: TBytes;
oChain: TsgcCertificateChain;
begin
oProvider.IssuerLookup := [iluSystemStore, iluLocalStore];
oProvider.IssuerFiles.Add('certs\ca-intermediate.pem');
oProvider.IssuerFiles.Add('certs\ca-root.pem');
vIssuerDER := oProvider.GetIssuerCertificate;
oChain := oProvider.GetCertificateChain;
end;
İki Yeni PAdES Profili
spPAdESBasicT gömülü bir zaman damgasıyla ve iptal verisi olmadan imzalar, imzanın yalnızca ne zaman atıldığını kanıtlaması gerektiğinde istediğiniz şey budur. spPAdESDocumentArchive tam tersi yönde ilerler ve uzun vadeli profilin üzerine bir arşiv zaman damgası ekler, iptal verisi dahil tüm belgeyi kapsar, böylece dosya ilk zaman damgasının kendi geçerlilik penceresi geçtikten sonra da denetlenebilir kalır.
uses
sgcSign_PAdES, sgcSign_Types;
var
oPAdES: TsgcPAdESSigner;
begin
oPAdES := TsgcPAdESSigner.Create(nil);
Try
oPAdES.KeyProvider := oProvider;
oPAdES.Profile.Profile := spPAdESDocumentArchive;
oPAdES.TSAClient := TSAClient1;
oPAdES.OCSPClient := OCSPClient1;
// revocation lists you supply yourself, for an authority whose CRL is
// issued by its own root. IssuerCertificate is resolved automatically
// when it is left empty and OCSPClient is assigned
oPAdES.CRLFiles.Add('crl\ca-intermediate.crl');
oPAdES.SignPDFFile('contract.pdf', 'contract-signed.pdf');
Finally
oPAdES.Free;
End;
end;
Sertifikalar Taşıdıkları Her Şeyi Bildiriyor
Konu ve düzenleyen eskiden ayrıştırıcının tanıdığı yedi özniteliği bildirir, geri kalanını atardı. Artık sertifikadaki her özniteliği bildiriyorlar, posta adresi okunabilir satırlara çözülüyor ve herhangi bir öznitelik OID'si ile okunabiliyor.
uses
sgcSign_X509;
var
i: Integer;
begin
// by OID: organizationIdentifier
ShowMessage(oCert.GetSubjectAttribute('2.5.4.97'));
// or the full list, in the order the certificate declares it
for i := 0 to oCert.SubjectAttributeCount - 1 do
Memo1.Lines.Add(oCert.SubjectAttributeOID[i] + ' = ' +
oCert.SubjectAttributeValue[i]);
end;
İmzalı Zaman Damgası İstekleri
Bazı nitelikli zaman damgası makamları, özellikle Polonya'dakiler, düz bir RFC 3161 isteğine yanıt vermez. İsteğin kendisinin bir CMS SignedData içine sarılmasını ve imzalanmasını isterler. Bu artık elle kurduğunuz bir şey değil, bir özellik.
uses
sgcSign_TSA;
begin
oTSA.URL := 'https://tsa.example.com';
oTSA.RequestFormat := trfCMS; // plain RFC 3161 is still the default
oTSA.KeyProvider := oProvider; // trfCMS needs one
// authorities differ in what they expect inside the wrapper
oTSA.SignOptions.IncludeSignedAttributes := True;
// and the exact bytes are available when an authority needs checking
oTSA.OnBeforeSendRequest := DoBeforeSendRequest;
oTSA.OnAfterReceiveResponse := DoAfterReceiveResponse;
end;
Varsayılan biçim, PWPW Sigillum zaman damgası makamının kabul ettiği bir istekle eşleşir. Mevcut kod düz bir istek göndermeye devam eder, RequestFormat ayarlanmadıkça hiçbir şey değişmez.
Authenticode Çapraz Sertifikaları
Çekirdek modu sürücü imzasının Microsoft Code Verification Root'a bir çapraz sertifika üzerinden zincirlenmesi gerekir, signtool /ac da bunu gömer. sgcSign artık ek sertifikaları aynı şekilde gömebiliyor.
uses
sgcSign_Authenticode;
var
oSigner: TsgcAuthenticodeSigner;
begin
oSigner := TsgcAuthenticodeSigner.Create(nil);
Try
oSigner.KeyProvider := oProvider;
oSigner.AddCertificateFromFile('MSCV-VSClass3.cer');
// or from bytes you already hold
// oSigner.AddCertificate(vCrossCertDER);
oSigner.SignFile('driver.sys', 'driver-signed.sys');
Finally
oSigner.Free;
End;
end;
Bunlar her iç içe imzaya aktarılır ve hiçbir şey eklenmemesi imzayı bayt bayt eskisi gibi bırakır. İmzalama sunucusu bir add_certs alanı, komut satırı ise tekrarlanabilir bir --add-cert seçeneği alır.
Güven Çıpalarıyla Doğrulama
Bu, sürümdeki en önemli değişiklik. Şimdiye kadar doğrulayıcı, imzalama sertifikasını denetlediği belgenin içinden alıyor ve o anahtarın o belgeyi imzaladığını teyit ediyordu. Bu yalnızca belgeyi yazanın içindeki imzayı da yazdığını kanıtlar, fazlasını değil. Herkes doğrulamadan geçen bir belge üretebilir.
Doğrulamaya artık güven çıpaları verilebiliyor ve sertifika zinciri bunlara karşı kuruluyor ve denetleniyor. Bir çıpa SHA-256 parmak iziyle ya da kendi anahtarı altında doğrulanarak eşleştirilir, asla adla değil.
uses
sgcSign_Verifier, sgcSign_Types;
var
oVerifier: TsgcSignatureVerifier;
begin
oVerifier := TsgcSignatureVerifier.Create(nil);
Try
oVerifier.TrustedCertificates.Add('certs\qualified-root.pem');
// or a Windows certificate store by name
oVerifier.TrustedCertificateStore := 'ROOT';
oVerifier.RequireTrustedChain := True;
oVerifier.CheckKeyUsage := True;
oVerifier.RequireCompleteRevocationCheck := True;
if oVerifier.Verify(vSignedXML) = vsValid then
ShowMessage('signed, and chained to a root you trust');
Finally
oVerifier.Free;
End;
end;
Çıpası olmayan bir doğrulayıcı daha önce döndürdüğü kararı döndürür, dolayısıyla yükseltmede hiçbir şey bozulmaz. Bir şey değişiyor: ETSI TS 119 102-2 raporu, hiçbir çıpaya zincirlenmemiş bir imza için artık total-passed demiyor, NO_CERTIFICATE_CHAIN_FOUND ile birlikte indeterminate diyor. Önceki sürümlerden saklanan raporların yeniden üretilmesi gerekir.
Proxy Destekli Tek Bir HTTP Taşıma Katmanı
Kitaplık birkaç yerden ağ isteği yapıyor: zaman damgası istemcisi, OCSP ve iptal listesi istemcileri, AB güven listesi indirmesi ve bulut anahtar sağlayıcıları. Her birinin bunu nasıl yapacağına dair kendi yaklaşımı vardı. Artık tek bir HTTPOptions özelliğiyle tek bir taşıma katmanını paylaşıyorlar.
uses
sgcSign_WinHTTP;
begin
oTSA.HTTPOptions.Proxy.Mode := pxCustom; // pxSystem is the default
oTSA.HTTPOptions.Proxy.URL := 'proxy.corp.local:8080';
oTSA.HTTPOptions.Proxy.Username := 'user';
oTSA.HTTPOptions.Proxy.Password := 'secret';
// the certificate presented when the gateway asks for client authentication
oTSA.HTTPOptions.ClientCertificate.StoreName := 'MY';
oTSA.HTTPOptions.ClientCertificate.Thumbprint := 'a1b2c3...';
oTSA.HTTPOptions.MinTLSVersion := tlsTLS1_2;
end;
Proxy, makine genelindeki proxy olabilir, hiç olmayabilir, açık bir adres olabilir ya da tarayıcının yaptığı gibi WPAD veya bir PAC betiği üzerinden çözümlenen kullanıcı başına ayar olabilir. Her ayarın varsayılanı, o isteklerin daha önce yaptığı davranıştır. Bu ayarların tarif edemediği bir ağ geçidi için, yeni bir OnHTTPRequest olayı taşıma katmanının tamamının yerini alır.
Bilinmeye Değer Küçük Şeyler
OCSP nonce'ları. İptal isteği artık sistem kriptografik üretecinden gelen rastgele bir nonce taşıyor ve yanıt buna karşı denetleniyor. Hiç nonce yansıtmayan bir yanıt hâlâ kabul ediliyor, çünkü RFC 6960 önceden üretilmiş yanıtlara izin verir, ancak farklı bir nonce yansıtan yanıt reddediliyor. NonceEnabled, bunu kabul etmeyen bir yanıtlayıcı için uzantıyı kapatır.
AB güven listesi pivot sabitlemesi. Yeni bir RequirePinnedPivot özelliği, güvenilen listeler listesinin sabitlenmiş AB Resmî Gazetesi pivot parmak izlerinden birine zincirlenmek zorunda olup olmadığına karar veriyor, sonucu ise LOTLPivotPinned ve LastPivotFingerprint bildiriyor. Denetim vardı ama hiçbir yerden çağrılmıyordu. Dağıtımla gelen sabitlenmiş sabitler hâlâ belgelerde geçen yer tutucular, dolayısıyla gerçek parmak izlerini doldurup özelliği açana kadar bir eşleşmeme bildirilir.
Seçtiğiniz bir özet. CAdES ve PKCS#11 birer HashAlgorithm özelliği kazanıyor, varsayılanı SHA-256 olduğu için mevcut kod aynı baytları üretiyor. CAdES eskiden her özet algoritmasına SHA-256'yı sabit değer olarak yazıyordu, PKCS#11 ise DigestInfo başlığını kendisine verilen verinin uzunluğuna göre seçiyordu, dolayısıyla başka bir özet ifade edilemiyordu. Bir kart artık istendiği gibi SHA-1, SHA-256, SHA-384 veya SHA-512 ile imzalayabiliyor.
İmzalama geri çağrısıyla ASiC. Yeni bir BuildCAdES aşırı yüklemesi, tamamlanmış imza baytları yerine bir geri çağrı alıyor. Önce META-INF/ASiCManifest.xml dosyasını oluşturuyor, tam olarak o baytları geri çağrınıza veriyor ve dönen sonucu META-INF/signature.p7s olarak saklıyor, imzanın manifesti kapsayabileceği tek sıra budur. Manifest taşımayan ASiC-S için geri çağrı veri belgesinin kendisini alır. GetCAdESSignedData, iki açık adımı tercih eden çağıranlar için aynı baytları döndürür.
Bulut KMS sertifikaları. AWS KMS ve Google Cloud KMS, HashiCorp Vault'ta zaten bulunan ikiliyle eşleşen SetCertificate ve SetCertificateFromFile çağrılarını kazanıyor. Her iki servis de yalnızca çıplak bir açık anahtar verir ve daha önce her iki sağlayıcıya da hangi X.509 sertifikasının ona ait olduğunu söylemenin bir yolu yoktu.
Komut satırını çalıştıran makineden bir zaman damgası. sgcsign komut satırı, sgcSign Server üzerinden geçmek yerine zaman damgası makamına doğrudan soran --tsa-direct seçeneğini kazanıyor. Bunu --tsa ile birlikte verin.
İmzalama Sunucusu
Sunucu tarafının kendi listesi var. Bir Authenticode imzası artık her biri için farklı bir sertifikayla ikiden fazla iç içe imza taşıyabiliyor, bunu sha1,sha256,sha384 gibi sıralı bir hash_algorithms listesi ya da certA:sha256,certB:sha1 gibi sıralı bir providers listesi üzerinden yapıyor, her iki yolda da en fazla dört girdiyle. Bu, süresi dolmakta olan bir sertifika ve onun yerine geçecek sertifikayla imzalanmış tek bir dosya dağıtmak içindir. Herhangi bir imzalama başlamadan önce her sertifika API anahtarının izinlerine karşı denetlenir.
Windows katalog dosyaları imzalanabiliyor: yükleme uç noktası biçim olarak catalog değerini kabul ediyor ve makecat aracının ürettiği türden mevcut bir .cat dosyasını imzalıyor, böylece bir sürücü paketi tıpkı bir program gibi imzalanıyor.
Yeni bir /api/v1/sign/raw uç noktası, önceden hesapladığınız bir özeti imzalıyor ve yalnızca imza değerini döndürüyor, PKCS#7 sarmalayıcı, imzalı öznitelikler ve zaman damgası olmadan. signtool aracının /dlib geri çağrısı üzerinden istediği tam olarak budur. Kendisine verilen her özeti imzalayacağı için varsayılan olarak kapalıdır ve allow_raw_sign ile her seferinde tek bir sağlayıcı için açılır.
API anahtarları ve onları oluşturan kullanıcılar artık proje bazında yalıtılıyor, bir proje yöneticisi kendi projesindeki anahtarları yönetiyor ve anahtarlar yalnızca tek yönlü iptal edilmek yerine etkinleştirilip devre dışı bırakılabiliyor. Anahtar başına hız sınırı ve günlük kota, anahtar oluşturulduktan sonra düzenlenebiliyor. Yeni bir SessionAbsoluteMaxMin ayarı, bir yönetici oturumunun toplam ömrünü varsayılan olarak on iki saatle sınırlıyor, çünkü kimliği doğrulanmış her istek eskiden sona erme zamanını üst sınır olmaksızın ileri itiyordu. Denetim günlüğü, konsolda ve CSV dışa aktarımında istemci adresine göre filtrelenebiliyor, kısmi adres soldan eşleşiyor. Ve varsayılan olarak kapalı olan yeni iletilen başlık ayarları, sunucu bir ters proxy arkasında çalışırken gerçek istemci adresini geri kazanıyor, buna yalnızca bağlantı listelenmiş güvenilir bir proxy'den geldiğinde inanılıyor.
Yeniden Üretmeniz Gereken İmzalar
Önceki sürümlerdeki üç kusur, yapısal olarak hatalı dosyalar üretti ve yükseltme yapmak zaten yazılmış bir dosyayı onarmaz. Bunlardan herhangi biri imzaladığınız şeyi tarif ediyorsa, onu 2026.9.0 ile yeniden imzalayın.
- Bir EC anahtarıyla imzalanmış her şey. Bir EC anahtarıyla üretilmiş her PAdES, CAdES, Authenticode, NuGet ve RFC 3161 imzası geçersizdi. Standartlar, bir CMS yapısının içindeki imza değerinin DER ECDSA-Sig-Value olmasını şart koşar, anahtar sağlayıcıları ise r ile s'nin ham birleşimini üretir ve girişte bunu hiçbir şey dönüştürmüyordu. P-256, P-384 ve P-521 artık çalışıyor. XAdES ve XML-DSig yolları doğruydu ve kasıtlı olarak olduğu gibi bırakıldı.
- Her CAdES imzası ve bir kartla, bir USB token'ıyla ya da bir bulut anahtarıyla imzalanmış her şey.
SignDataçağrısının yazılı bir sözleşmesi yoktu ve sağlayıcılar argümanının veri mi yoksa onun özeti mi olduğu konusunda anlaşamıyordu, dolayısıyla bir CAdES imzası bir özetin özeti üzerinde RSA idi. Argüman artık ham baytlardır ve sağlayıcı bunları yapılandırılmış özetiyle özetler. - Başka bir imzalayıcı aynı anahtar sağlayıcısını kullandıktan sonra imzalanan PAdES dosyaları.
Profile.HashAlgorithmyapıcıda bir kez yazılıyor ve bir daha hiç okunmuyordu, dolayısıyla bir Facturae veya SAF-T imzalayıcısından sonra imzalanan bir PDF, SHA-256 bildiren bir imzanın içinde SHA-1 özeti üzerinde RSA olabiliyordu.
Doğrulama da aynı yönde değişti. Authenticode doğrulaması hiçbir zaman bir imzayı denetlemiyordu, dosya özetini yeniden hesaplayıp imzadakiyle karşılaştırıyordu, dolayısıyla sgcSign'ın geçerli biçimde imzalanmış dediği bir dosyanın sahtesini üretmek için özel anahtara gerek yoktu. İptal yanıtları ve zaman damgası jetonları doğrulanmadan gömülüyordu. AB güven listesi hiçbir şey doğrulanmadan indirilip kullanılıyordu. Bunların hepsi artık adının ima ettiği denetimi yapıyor ve her birinin tam açıklaması değişiklik günlüğünde.
Nasıl Edinilir
sgcSign 2026.9.0 şimdi edinilebilir durumda, tam kaynak kodu ve bir yıllık güncellemeyle birlikte, Delphi 7'den Delphi 13 Florence'a kadar, eşleşen C++ Builder sürümleri ve .NET için.
Ürün sayfası · Deneme sürümünü indirin · Değişiklik günlüğü
Sorularınız veya geri bildiriminiz mi var? Bize ulaşın, kodu yazan kişilerden yanıt alacaksınız.
