Firma tu primer documento en 5 minutos
Recorrido completo desde un proyecto VCL nuevo hasta un sobre XAdES firmado. Funciona en Delphi 7 hasta RAD Studio 13 y en C++Builder.
Recorrido completo desde un proyecto VCL nuevo hasta un sobre XAdES firmado. Funciona en Delphi 7 hasta RAD Studio 13 y en C++Builder.
Solo dos cosas — sgcSign instalado en el IDE y un certificado PFX con el que firmar.
# 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".
Inicia una aplicación VCL Forms en tu IDE. Coloca dos memos y un botón en el formulario — esa es toda la interfaz.
TMemo, pega aquí tu XML sin firmar.
TMemo, aquí aparecerá el XML firmado tras pulsar el botón.
TButton, conectado al manejador OnClick del paso 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
Carga un proveedor PFX, apunta un firmador de documento a él con el perfil VeriFactu y llama a SignXML.
TsgcPFXKeyProvider importa el .pfx vía Windows CNG — la firma SHA-256 moderna funciona sea cual sea el CSP original.
TsgcDocumentSigner elige el nivel XAdES adecuado en función del perfil.
spVeriFactu selecciona VeriFactu de la AEAT española — XAdES-EPES, B-B, RSA-SHA256, C14N exclusiva.
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 asegura que los proveedores se liberan aunque la firma lance una excepción.
UnicodeString de extremo a extremo — sin preocuparte por conversiones ANSI/UTF-8.
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;
}
}
Dos unidades en tu cláusula uses — el proveedor PFX y el firmador de documento.
uses de DelphiCada proveedor de claves vive en su propia unidad para que solo pagues por lo que referencias. sgcSign_DocumentSigner añade la capa de enrutamiento que elige XAdES, PAdES o CAdES según la entrada.
uses
Classes, SysUtils, Forms, StdCtrls, Controls,
// sgc
sgcSign_KeyProvider_PFX,
sgcSign_DocumentSigner;
Las mismas unidades, expuestas como cabeceras .hpp. El linker de C++ Builder resuelve automáticamente las bibliotecas estáticas subyacentes.
#include "sgcSign_KeyProvider_PFX.hpp"
#include "sgcSign_DocumentSigner.hpp"
Pulsa F9, pega una factura en el memo superior y haz clic en Sign XML. El sobre firmado aparece en el memo inferior.
Pulsa F9 en el IDE. El formulario se abre con dos memos y un botón. Sin excepciones, sin unidades ausentes.
Pega cualquier XML de factura (o cualquier XML bien formado) en memoXML. El firmador lo normaliza internamente a UTF-8.
memoSigned contiene ahora tu XML con un elemento <ds:Signature> enveloped añadido. Guárdalo y pásalo por cualquier verificador XAdES — o usa TsgcSignatureVerifier directamente.
En Delphi 7, string equivale a AnsiString. Usa las sobrecargas WideString para hacer round-trip de caracteres polacos, cirílicos o griegos sin pérdida.
En Delphi 7 la sobrecarga string pasa por la ACP del sistema. Los diacríticos de 'Jarosław' solo hacen round-trip cuando la ACP del sistema es CP1250. Si la ACP es CP1252, los caracteres se corrompen en el XML firmado.
Las sobrecargas WideString evitan por completo la ACP — pasan de UTF-16 a UTF-8 mediante WideCharToMultiByte con CP_UTF8. En Delphi 2009+ ambas sobrecargas son equivalentes; UnicodeString ya es UTF-16.
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;
Todos los sellos de tiempo X.509 / CRL / OCSP / TSA se almacenan como valores TDateTime en UTC, conforme a las especificaciones ASN.1 subyacentes.
Para mostrarlos al usuario final, usa las propiedades *Local de cada componente (p. ej. vCert.NotAfterLocal) o convierte manualmente con sgcUTCToLocal de la unidad sgcSign_Time.
Esto coincide con RFC 5280 (X.509), RFC 3161 (TSA) y RFC 6960 (OCSP), que especifican UTC. El helper sgcUTCNow devuelve el TDateTime UTC actual para código que necesite comparar sellos de tiempo.
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 es solo el comienzo. PAdES, CAdES, perfiles, proveedores de claves y el servidor centralizado están a un clic.
Recorre toda la superficie de la API XAdES, PAdES y CAdES y la infraestructura de sello de tiempo + OCSP que la sostiene.
Leer más →VeriFactu, FatturaPA, KSeF, FACTUR-X, además de 9 perfiles de contratos laborales de la UE. Cambio de jurisdicción en una línea.
Leer más →PFX, PEM, almacén de Windows, PKCS#11, Azure Trusted Signing, AWS KMS, Google KMS, Vault, Certum, CSC v2.
Leer más →Centraliza la firma en toda la build farm. API REST, panel web, GitHub Actions, Azure DevOps, Jenkins y Docker.
Leer más →