Signe ton premier document en 5 minutes
Un parcours complet, d'un projet VCL vierge à une enveloppe XAdES signée. Fonctionne avec Delphi 7 jusqu'à RAD Studio 13 et C++Builder.
Un parcours complet, d'un projet VCL vierge à une enveloppe XAdES signée. Fonctionne avec Delphi 7 jusqu'à RAD Studio 13 et C++Builder.
Deux choses seulement — sgcSign installé dans l'IDE et un certificat PFX pour signer.
# Pas encore de PFX ? Génère un certificat de test auto-signé avec 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
# Tu disposes maintenant de test.pfx avec le mot de passe « secret ».
Lance une application VCL Forms dans ton IDE. Pose deux mémos et un bouton sur la fiche — c'est toute l'interface.
TMemo, colle ton XML non signé ici.
TMemo, le XML signé apparaît ici après le clic sur le bouton.
TButton, raccordé au gestionnaire OnClick à l'étape 2.
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
Charge un fournisseur PFX, pointe un signataire de document dessus avec le profil VeriFactu et appelle SignXML.
TsgcPFXKeyProvider importe le .pfx via Windows CNG — la signature SHA-256 moderne fonctionne quelle que soit le CSP d'origine.
TsgcDocumentSigner choisit le bon niveau XAdES en fonction du profil.
spVeriFactu sélectionne l'AEAT VeriFactu espagnol — XAdES-EPES, B-B, RSA-SHA256, C14N exclusive.
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 garantit que les fournisseurs sont libérés même si la signature lève une exception.
UnicodeString est utilisé de bout en bout — aucune conversion ANSI/UTF-8 à se soucier.
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;
}
}
Deux unités dans ta clause uses — le fournisseur PFX et le signataire de document.
uses DelphiChaque fournisseur de clés vit dans sa propre unité, tu ne paies donc que pour ce que tu référenceras. sgcSign_DocumentSigner apporte la couche de routage qui choisit XAdES, PAdES ou CAdES en fonction de l'entrée.
uses
Classes, SysUtils, Forms, StdCtrls, Controls,
// sgc
sgcSign_KeyProvider_PFX,
sgcSign_DocumentSigner;
Mêmes unités, exposées en tant qu'en-têtes .hpp. Le linker C++ Builder résout automatiquement les bibliothèques statiques sous-jacentes.
#include "sgcSign_KeyProvider_PFX.hpp"
#include "sgcSign_DocumentSigner.hpp"
Appuie sur F9, colle une facture dans le mémo du haut, clique sur Sign XML. L'enveloppe signée apparaît dans le mémo du bas.
Appuie sur F9 dans l'IDE. La fiche s'ouvre avec deux mémos et un bouton. Aucune exception, aucune unité manquante.
Dépose n'importe quel XML de facture (ou tout XML bien formé) dans memoXML. Le signataire le normalise en UTF-8 en interne.
memoSigned contient maintenant ton XML avec un élément <ds:Signature> en enveloppe ajouté. Sauvegarde-le, fais-le passer dans n'importe quel vérificateur XAdES — ou utilise directement TsgcSignatureVerifier.
Sur Delphi 7, string est AnsiString. Utilise les surcharges WideString pour faire transiter les caractères polonais, cyrilliques ou grecs sans perte.
Sur Delphi 7, la surcharge string passe par l'ACP du système. Les diacritiques de 'Jarosław' ne font l'aller-retour que si l'ACP système est CP1250. Si l'ACP est CP1252, les caractères sont corrompus dans le XML signé.
Les surcharges WideString contournent entièrement l'ACP — UTF-16 vers UTF-8 via WideCharToMultiByte avec CP_UTF8. Sur Delphi 2009+, les deux surcharges sont équivalentes ; UnicodeString est déjà en UTF-16.
var
Doc: IXMLDocument; // MSXML6
XML, Signed: WideString; // = DOMString MSXML6
Sign: TsgcXAdESSigner;
begin
Doc.SaveToXML(XML); // sortie WideString, aucune étape ACP
Signed := Sign.SignXML(XML); // résout vers la surcharge WideString
// Aller-retour sans perte du polonais, cyrillique, grec
end;
Tous les horodatages X.509 / CRL / OCSP / TSA sont stockés en tant que valeurs TDateTime UTC, conformément aux spécifications ASN.1 sous-jacentes.
Pour les affichages utilisateur, utilise les propriétés *Local sur chaque composant (par exemple vCert.NotAfterLocal) ou convertis manuellement avec sgcUTCToLocal de l'unité sgcSign_Time.
Cela correspond à la RFC 5280 (X.509), à la RFC 3161 (TSA) et à la RFC 6960 (OCSP) qui spécifient toutes UTC. L'helper sgcUTCNow renvoie le TDateTime UTC actuel pour le code qui doit comparer des horodatages.
uses sgcSign_Time;
// Affiche la validité du certificat en heure locale
Memo1.Lines.Add('Cert expires: ' +
DateTimeToStr(vCert.NotAfterLocal));
Memo1.Lines.Add('Now (UTC): ' +
DateTimeToStr(sgcUTCNow));
// Ou convertis manuellement
vLocal := sgcUTCToLocal(vCert.NotAfter);
XAdES n'est qu'un début. PAdES, CAdES, profils, fournisseurs de clés et le serveur centralisé ne sont qu'à un clic.
Découvre toute la surface d'API XAdES, PAdES, CAdES et l'infrastructure de support horodatage + OCSP.
En savoir plus →VeriFactu, FatturaPA, KSeF, FACTUR-X, plus 9 profils de contrat de travail UE. Bascule de juridiction en une ligne.
En savoir plus →PFX, PEM, magasin Windows, PKCS#11, Azure Trusted Signing, AWS KMS, Google KMS, Vault, Certum, CSC v2.
En savoir plus →Centralise la signature sur l'ensemble de la build farm. API REST, admin web, GitHub Actions, Azure DevOps, Jenkins, Docker.
En savoir plus →