İ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.
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.
Yalnızca iki şey — IDE'ye yüklenmiş sgcSign ve imzalamak için bir PFX sertifikası.
# 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".
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.
TMemo, imzalanmamış XML'inizi buraya yapıştırın.
TMemo, düğmeye tıklandıktan sonra imzalı XML burada görünür.
TButton, 2. adımdaki OnClick işleyicisine bağlanır.
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
Bir PFX sağlayıcı yükleyin, VeriFactu profiliyle bir belge imzalayıcıyı ona yönlendirin ve SignXML çağırın.
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.
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;
__finally bloğu, imzalama hata fırlatsa bile sağlayıcıların serbest bırakılmasını sağlar.
UnicodeString kullanılır — endişelenecek ANSI/UTF-8 dönüşümü yok.
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;
}
}
uses cümlenizde iki birim — PFX sağlayıcı ve belge imzalayıcı.
uses cümlesiHer 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.
uses
Classes, SysUtils, Forms, StdCtrls, Controls,
// sgc
sgcSign_KeyProvider_PFX,
sgcSign_DocumentSigner;
Aynı birimler, .hpp başlıkları olarak sunulur. C++ Builder bağlayıcısı, temel statik kitaplıkları otomatik olarak çözer.
#include "sgcSign_KeyProvider_PFX.hpp"
#include "sgcSign_DocumentSigner.hpp"
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.
IDE'de F9'a basın. Form, iki memo ve bir düğmeyle açılır. İstisna yok, eksik birim yok.
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.
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.
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.
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.
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;
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.
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.
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);
XAdES yalnızca başlangıçtır. PAdES, CAdES, profiller, anahtar sağlayıcılar ve merkezi sunucu yalnızca bir tık uzakta.
Tam XAdES, PAdES, CAdES API yüzeyini ve destekleyici zaman damgası + OCSP altyapısını inceleyin.
Devamını okuyun →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 →PFX, PEM, Windows deposu, PKCS#11, Azure Trusted Signing, AWS KMS, Google KMS, Vault, Certum, CSC v2.
Devamını okuyun →İmzalamayı derleme çiftliği genelinde merkezileştirin. REST API, web yönetici paneli, GitHub Actions, Azure DevOps, Jenkins, Docker.
Devamını okuyun →