sgcSign 2026.9.0'da Neler Yeni

· Sürümler
sgcSign 2026.9.0, Delphi ve C++ Builder için dijital imza bileşenleri

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.

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.