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.

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

Avant de commencer

Deux choses seulement — sgcSign installé dans l'IDE et un certificat PFX pour signer.

Ce dont tu auras besoin

  • sgcSign installé dans ton IDE — consulte la page de téléchargement.
  • Un fichier de certificat PFX avec son mot de passe (tout fichier X.509 PKCS#12 fonctionne).
  • Delphi 7 jusqu'à RAD Studio 13 ou toute version de C++ Builder. Windows 32 bits et 64 bits sont tous deux pris en charge.
  • Aucune dépendance externe — sgcSign utilise Windows CNG/BCrypt pour la cryptographie et WinHTTP pour les appels réseau.
make-test-cert.sh
# 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 ».

Crée un nouveau projet

Lance une application VCL Forms dans ton IDE. Pose deux mémos et un bouton sur la fiche — c'est toute l'interface.

Disposition de la fiche

  • memoXMLTMemo, colle ton XML non signé ici.
  • memoSignedTMemo, le XML signé apparaît ici après le clic sur le bouton.
  • btnSignTButton, raccordé au gestionnaire OnClick à l'étape 2.
  • Aucun composant design-time requis — tout est créé par code.
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

Ajoute le code de signature

Charge un fournisseur PFX, pointe un signataire de document dessus avec le profil VeriFactu et appelle SignXML.

Delphi

  • 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.
  • Remplace la constante par l'un des 21 profils par pays — consulte Profils par pays.
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

  • Même forme, mêmes classes, mêmes noms de propriété — le wrapper C++ est un portage 1:1 de l'API Delphi.
  • Le bloc __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.
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;
  }
}

Ajoute les unités requises

Deux unités dans ta clause uses — le fournisseur PFX et le signataire de document.

Clause uses Delphi

Chaque 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.

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

Includes C++ Builder

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.

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

Exécute et teste

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.

Compile et exécute

Appuie sur F9 dans l'IDE. La fiche s'ouvre avec deux mémos et un bouton. Aucune exception, aucune unité manquante.

Colle l'entrée

Dépose n'importe quel XML de facture (ou tout XML bien formé) dans memoXML. Le signataire le normalise en UTF-8 en interne.

Vérifie le résultat

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.

Unicode et la surcharge WideString

Sur Delphi 7, string est AnsiString. Utilise les surcharges WideString pour faire transiter les caractères polonais, cyrilliques ou grecs sans perte.

Le piège

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.

d7-unicode.pas
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;

UTC par défaut

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.

Affichage en heure locale

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.

time-zones.pas
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);

Pour aller plus loin

XAdES n'est qu'un début. PAdES, CAdES, profils, fournisseurs de clés et le serveur centralisé ne sont qu'à un clic.

Aperçu des fonctionnalités

Découvre toute la surface d'API XAdES, PAdES, CAdES et l'infrastructure de support horodatage + OCSP.

En savoir plus →

21 profils par pays

VeriFactu, FatturaPA, KSeF, FACTUR-X, plus 9 profils de contrat de travail UE. Bascule de juridiction en une ligne.

En savoir plus →

10 fournisseurs de clés

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

En savoir plus →

Serveur sgcSign

Centralise la signature sur l'ensemble de la build farm. API REST, admin web, GitHub Actions, Azure DevOps, Jenkins, Docker.

En savoir plus →

Prêt pour la production ?

Télécharge l'essai, livre un binaire signé aujourd'hui, prends une licence sgcSign quand tu seras satisfait.