İlk Belgenizi 5 Dakikada İmzalayın

Yeni bir VCL projesinden imzalı bir XAdES zarfına kadar eksiksiz bir adım adım kılavuz. Delphi 7'den RAD Studio 13'e ve C++Builder ile çalışır.

Delphi 7 – RAD Studio 13
C++ Builder
VeriFactu Profili

Başlamadan Önce

Yalnızca iki şey — IDE'ye yüklenmiş sgcSign ve imzalamak için bir PFX sertifikası.

İhtiyacınız olanlar

  • IDE'nize yüklenmiş sgcSignindirme sayfasına bakın.
  • Parolasıyla birlikte bir PFX sertifika dosyası (herhangi bir X.509 PKCS#12 dosyası çalışır).
  • Delphi 7'den RAD Studio 13'e veya herhangi bir C++ Builder sürümü. 32 bit ve 64 bit Windows desteklenir.
  • Harici bağımlılık yok — sgcSign kriptografi için Windows CNG/BCrypt ve ağ çağrıları için WinHTTP kullanır.
make-test-cert.sh
# No PFX yet? Generate a self-signed test cert with OpenSSL:
openssl req -x509 -newkey rsa:2048 \
  -keyout key.pem -out cert.pem \
  -days 365 -nodes \
  -subj "/CN=sgcSign Test"

openssl pkcs12 -export \
  -inkey key.pem -in cert.pem \
  -out test.pfx \
  -password pass:secret

# Now you have test.pfx with password "secret".

Yeni Bir Proje Oluşturun

IDE'nizde bir VCL Forms uygulaması başlatın. Forma iki memo ve bir düğme bırakın — tüm kullanıcı arayüzü budur.

Form düzeni

  • memoXMLTMemo, imzalanmamış XML'inizi buraya yapıştırın.
  • memoSignedTMemo, düğmeye tıklandıktan sonra imzalı XML burada görünür.
  • btnSignTButton, 2. adımdaki OnClick işleyicisine bağlanır.
  • Tasarım zamanı bileşeni gerekmez — her şey kodda oluşturulur.
Unit1.dfm
object Form1: TForm1
  Caption = 'sgcSign Quick Start'
  ClientWidth  = 800
  ClientHeight = 600

  object memoXML: TMemo
    Left = 8
    Top  = 8
    Width  = 784
    Height = 240
  end

  object memoSigned: TMemo
    Left = 8
    Top  = 288
    Width  = 784
    Height = 300
  end

  object btnSign: TButton
    Left = 8
    Top  = 256
    Caption = 'Sign XML'
  end
end

İmzalama Kodunu Ekleyin

Bir PFX sağlayıcı yükleyin, VeriFactu profiliyle bir belge imzalayıcıyı ona yönlendirin ve SignXML çağırın.

Delphi

  • TsgcPFXKeyProvider, .pfx dosyasını Windows CNG aracılığıyla içe aktarır — modern SHA-256 imzalama, orijinal CSP'den bağımsız olarak çalışır.
  • TsgcDocumentSigner, profile göre doğru XAdES düzeyini seçer.
  • spVeriFactu, İspanyol AEAT VeriFactu'yu seçer — XAdES-EPES, B-B, RSA-SHA256, özel C14N.
  • Sabiti 21 ülke profilinden herhangi biriyle değiştirin — Ülke Profilleri'ne bakın.
Unit1.pas
procedure TForm1.btnSignClick(Sender: TObject);
var
  vKeyProvider: TsgcPFXKeyProvider;
  vSigner: TsgcDocumentSigner;
begin
  vKeyProvider := TsgcPFXKeyProvider.Create(nil);
  try
    vKeyProvider.FileName := 'certificate.pfx';
    vKeyProvider.Password := 'secret';
    vKeyProvider.LoadFromFile;

    vSigner := TsgcDocumentSigner.Create(nil);
    try
      vSigner.KeyProvider := vKeyProvider;
      vSigner.Profile := spVeriFactu;
      memoSigned.Text := vSigner.SignXML(memoXML.Text);
    finally
      vSigner.Free;
    end;
  finally
    vKeyProvider.Free;
  end;
end;

C++ Builder

  • Aynı yapı, aynı sınıflar, aynı özellik adları — C++ sarmalayıcısı, Delphi API'sinin 1:1 bir bağlantı noktasıdır.
  • __finally bloğu, imzalama hata fırlatsa bile sağlayıcıların serbest bırakılmasını sağlar.
  • Uçtan uca UnicodeString kullanılır — endişelenecek ANSI/UTF-8 dönüşümü yok.
Unit1.cpp
void __fastcall TForm1::btnSignClick(TObject *Sender)
{
  TsgcPFXKeyProvider *vKeyProvider = new TsgcPFXKeyProvider(NULL);
  try {
    vKeyProvider->FileName = "certificate.pfx";
    vKeyProvider->Password = "secret";
    vKeyProvider->LoadFromFile();

    TsgcDocumentSigner *vSigner = new TsgcDocumentSigner(NULL);
    try {
      vSigner->KeyProvider = vKeyProvider;
      vSigner->Profile = spVeriFactu;
      memoSigned->Text = vSigner->SignXML(memoXML->Text);
    } __finally {
      delete vSigner;
    }
  } __finally {
    delete vKeyProvider;
  }
}

Gerekli Birimleri Ekleyin

uses cümlenizde iki birim — PFX sağlayıcı ve belge imzalayıcı.

Delphi uses cümlesi

Her anahtar sağlayıcı kendi biriminde bulunur, böylece yalnızca başvurduğunuz şey için ödeme yaparsınız. sgcSign_DocumentSigner, girişe göre XAdES, PAdES veya CAdES seçen yönlendirme katmanını getirir.

Unit1.pas
uses
  Classes, SysUtils, Forms, StdCtrls, Controls,
  // sgc
  sgcSign_KeyProvider_PFX,
  sgcSign_DocumentSigner;

C++ Builder içermeleri

Aynı birimler, .hpp başlıkları olarak sunulur. C++ Builder bağlayıcısı, temel statik kitaplıkları otomatik olarak çözer.

Unit1.cpp
#include "sgcSign_KeyProvider_PFX.hpp"
#include "sgcSign_DocumentSigner.hpp"

Çalıştırın ve Test Edin

F9'a basın, üst memoya bir fatura yapıştırın, Sign XML'e tıklayın. İmzalı zarf alt memoda görünür.

Derleyin ve çalıştırın

IDE'de F9'a basın. Form, iki memo ve bir düğmeyle açılır. İstisna yok, eksik birim yok.

Girişi yapıştırın

Herhangi bir fatura XML'ini (veya herhangi bir iyi biçimlendirilmiş XML'i) memoXML'e bırakın. İmzalayıcı, bunu dahili olarak UTF-8'e normalleştirir.

Sonucu doğrulayın

memoSigned artık eklenmiş sarmalanmış bir <ds:Signature> öğesiyle XML'inizi içerir. Kaydedin, herhangi bir XAdES doğrulayıcısından geçirin — veya doğrudan TsgcSignatureVerifier kullanın.

Unicode ve WideString Aşırı Yüklemesi

Delphi 7'de string, AnsiString'tir. Lehçe, Kiril veya Yunanca karakterleri kayıpsız olarak gidip getirmek için WideString aşırı yüklemelerini kullanın.

Tuzak

Delphi 7'de string aşırı yüklemesi sistem ACP'si üzerinden yönlendirilir. 'Jarosław' içindeki aksan işaretleri yalnızca sistem ACP'si CP1250 olduğunda gidip gelir. ACP CP1252 ise, karakterler imzalı XML'de bozulur.

WideString aşırı yüklemeleri ACP'yi tamamen atlar — CP_UTF8 ile WideCharToMultiByte aracılığıyla UTF-16'dan UTF-8'e. Delphi 2009+ üzerinde her iki aşırı yükleme de eşdeğerdir; UnicodeString zaten UTF-16'dır.

d7-unicode.pas
var
  Doc: IXMLDocument;       // MSXML6
  XML, Signed: WideString; // = MSXML6 DOMString
  Sign: TsgcXAdESSigner;
begin
  Doc.SaveToXML(XML);            // WideString out, no ACP step
  Signed := Sign.SignXML(XML);   // resolves to WideString overload
  // Polish, Cyrillic, Greek round-trip losslessly
end;

Varsayılan Olarak UTC

Tüm X.509 / CRL / OCSP / TSA zaman damgaları, temel ASN.1 spesifikasyonlarıyla eşleşecek şekilde UTC TDateTime değerleri olarak saklanır.

Yerel saatte görüntüleme

Son kullanıcı görüntülemeleri için her bileşendeki *Local özelliklerini kullanın (örn. vCert.NotAfterLocal) veya sgcSign_Time biriminden sgcUTCToLocal ile manuel olarak dönüştürün.

Bu, tümü UTC belirten RFC 5280 (X.509), RFC 3161 (TSA) ve RFC 6960 (OCSP) ile eşleşir. sgcUTCNow yardımcısı, zaman damgalarını karşılaştırması gereken kod için geçerli UTC TDateTime'ı döndürür.

time-zones.pas
uses sgcSign_Time;

// Display certificate validity in local time
Memo1.Lines.Add('Cert expires: ' +
                DateTimeToStr(vCert.NotAfterLocal));
Memo1.Lines.Add('Now (UTC):    ' +
                DateTimeToStr(sgcUTCNow));

// Or convert manually
vLocal := sgcUTCToLocal(vCert.NotAfter);

Buradan Nereye Gidilir

XAdES yalnızca başlangıçtır. PAdES, CAdES, profiller, anahtar sağlayıcılar ve merkezi sunucu yalnızca bir tık uzakta.

Özelliklere Genel Bakış

Tam XAdES, PAdES, CAdES API yüzeyini ve destekleyici zaman damgası + OCSP altyapısını inceleyin.

Devamını okuyun →

21 Ülke Profili

VeriFactu, FatturaPA, KSeF, FACTUR-X ve 9 AB iş sözleşmesi profili. Tek satırlık yargı bölgesi değiştirme.

Devamını okuyun →

10 Anahtar Sağlayıcı

PFX, PEM, Windows deposu, PKCS#11, Azure Trusted Signing, AWS KMS, Google KMS, Vault, Certum, CSC v2.

Devamını okuyun →

sgcSign Server

İmzalamayı derleme çiftliği genelinde merkezileştirin. REST API, web yönetici paneli, GitHub Actions, Azure DevOps, Jenkins, Docker.

Devamını okuyun →

Üretime Hazır mısınız?

Denemeyi indirin, bugün imzalı bir ikili dosya gönderin, memnun kaldığınızda sgcSign'i lisanslayın.