Użyj własnego klucza — 10 dostawców

Wszyscy dostawcy implementują interfejs IsgcKeyProvider — ten sam kod podpisujący działa z plikami lokalnymi, kartami inteligentnymi, HSM, cloud KMS lub zdalnymi QTSP. Zmiana wymaga jednej linii kodu.

Local Files (PFX, PEM)
Hardware (PKCS#11)
Cloud KMS (Azure, AWS, GCP)
QTSPs (Certum, CSC v2)

TsgcPFXKeyProvider

Pliki PFX / PKCS#12. Lokalny klucz chroniony hasłem. Najlepszy do programowania, małych wdrożeń i każdego przepływu pracy, w którym certyfikat dostarczany jest jako pojedynczy plik .pfx/.p12.

  • Importowany przez Windows CNG z flagą PKCS12_PREFER_CNG_KSP — podpisywanie SHA-256/384/512 działa niezależnie od oryginalnego CSP.
  • Pliki .pfx z wieloma certyfikatami są przeglądane automatycznie aż do znalezienia certyfikatu z kluczem prywatnym.
pfx.pas
var
  vPFX: TsgcPFXKeyProvider;
begin
  vPFX := TsgcPFXKeyProvider.Create(nil);
  try
    vPFX.FileName := 'certificate.pfx';
    vPFX.Password := 'mypassword';
    vPFX.LoadFromFile;
    // vSigner.KeyProvider := vPFX;
  finally
    vPFX.Free;
  end;
end;

TsgcPEMKeyProvider

Pliki PEM. Szyfrowany PKCS#8 z natywną obsługą PBES2 / PBKDF2 / AES-CBC, plus starszy format DEK-Info klucza prywatnego RSA. Najlepszy dla potoków opartych na OpenSSL.

  • Obsługiwane są BEGIN CERTIFICATE, BEGIN RSA PRIVATE KEY, BEGIN PRIVATE KEY, BEGIN ENCRYPTED PRIVATE KEY.
  • Połączone PEM (certyfikat + klucz w jednym pliku) są wykrywane automatycznie — zostaw PrivateKeyFile puste.
pem.pas
var
  vPEM: TsgcPEMKeyProvider;
begin
  vPEM := TsgcPEMKeyProvider.Create(nil);
  try
    vPEM.CertificateFile := 'cert.pem';
    vPEM.PrivateKeyFile  := 'key.pem';
    vPEM.PrivateKeyPassword := 'secret';
    vPEM.LoadFromFile;
    // vSigner.KeyProvider := vPEM;
  finally
    vPEM.Free;
  end;
end;

TsgcWindowsCertStoreProvider

Magazyn certyfikatów Windows. Magazyny lokalnej maszyny i bieżącego użytkownika. Najlepszy dla aplikacji desktopowych używających istniejących certyfikatów wydanych przez AD lub każdego wdrożenia, w którym Windows już zarządza cyklem życia certyfikatów.

  • Podpisywanie odbywa się przez Windows CNG — klucz prywatny nigdy nie opuszcza magazynu.
  • Wybór po podciągu CN podmiotu lub po odcisku SHA-1.
winstore.pas
var
  vStore: TsgcWindowsCertStoreProvider;
begin
  vStore := TsgcWindowsCertStoreProvider.Create(nil);
  try
    vStore.StoreName := 'MY';
    vStore.StoreLocation := cslCurrentUser;
    vStore.SelectCertificateBySubject('My Company');
    // vSigner.KeyProvider := vStore;
  finally
    vStore.Free;
  end;
end;

TsgcPKCS11Provider

PKCS#11 / sprzętowe tokeny. Karty inteligentne, tokeny USB, HSM — SafeNet, YubiKey, Nitrokey, Thales. Wymagane do kwalifikowanych podpisów elektronicznych w większości jurysdykcji UE.

  • Obsługiwane mechanizmy CKM_RSA_PKCS i CKM_ECDSA_SHA256.
  • Pomocniki EnumerateSlots / EnumerateCertificates do wyboru właściwego slotu w czasie działania.
pkcs11.pas
var
  vTok: TsgcPKCS11Provider;
begin
  vTok := TsgcPKCS11Provider.Create(nil);
  try
    vTok.LibraryPath := 'C:\token\pkcs11.dll';
    vTok.SlotIndex := 0;
    vTok.PIN := '1234';
    vTok.CertificateLabel := 'MyCert';
    vTok.Connect;
    // vSigner.KeyProvider := vTok;
  finally
    vTok.Free;
  end;
end;

TsgcAzureTrustedSigningProvider

Azure Trusted Signing. Kwalifikowana usługa podpisywania kodu Microsoftu. Authenticode bez kupowania certyfikatu EV — Microsoft jest właścicielem certyfikatu i udostępnia klucz podpisujący.

  • Dane uwierzytelniające OAuth2 klienta — Tenant ID + Client ID + Client Secret.
  • Klucze prywatne przechowywane wyłącznie w Azure, nigdy na agencie build.
azure-ts.pas
var
  vAzure: TsgcAzureTrustedSigningProvider;
begin
  vAzure := TsgcAzureTrustedSigningProvider.Create(nil);
  try
    vAzure.TenantId := 'your-tenant-id';
    vAzure.ClientId := 'your-client-id';
    vAzure.ClientSecret := 'your-client-secret';
    vAzure.AccountName := 'mySigningAccount';
    vAzure.CertificateProfileName := 'default';
    vAzure.Connect;
    // vSigner.KeyProvider := vAzure;
  finally
    vAzure.Free;
  end;
end;

TsgcAWSKMSKeyProvider

AWS Key Management Service. Usługa przechowywania kluczy Amazona wspierana przez HSM. Połącz z certyfikatem wystawionym przez AWS do podpisywania w chmurze bez ujawniania klucza prywatnego.

  • Uwierzytelnianie AWS Signature Version 4, obliczane w procesie.
  • KeyId akceptuje identyfikator klucza, ARN klucza lub ARN aliasu.
aws-kms.pas
var
  vAWS: TsgcAWSKMSKeyProvider;
begin
  vAWS := TsgcAWSKMSKeyProvider.Create(nil);
  try
    vAWS.AccessKeyId := 'AKIAIOSFODNN7EXAMPLE';
    vAWS.SecretAccessKey := 'wJalrXUtnFEMI/K7MDENG/...';
    vAWS.Region := 'us-east-1';
    vAWS.KeyId := 'arn:aws:kms:us-east-1:...:key/my-key';
    vAWS.Connect;
    // vSigner.KeyProvider := vAWS;
  finally
    vAWS.Free;
  end;
end;

TsgcGCloudKMSKeyProvider

Google Cloud KMS. Ten sam model operacyjny co AWS KMS. Plik JSON konta usługi uwierzytelnia się przez wymianę JWT na token dostępu OAuth2, a następnie podpisuje przez Cloud KMS API.

  • ProjectId + Location + KeyRing + Key + Version — odwzorowuje hierarchię zasobów GCP 1:1.
  • Tylko asymetryczne klucze KMS — wspierane przez HSM, jeśli dostępne, inaczej chronione programowo.
gcloud-kms.pas
var
  vGCloud: TsgcGCloudKMSKeyProvider;
begin
  vGCloud := TsgcGCloudKMSKeyProvider.Create(nil);
  try
    vGCloud.ProjectId := 'my-project';
    vGCloud.LocationId := 'global';
    vGCloud.KeyRingId := 'my-key-ring';
    vGCloud.KeyId := 'my-signing-key';
    vGCloud.KeyVersion := '1';
    vGCloud.ServiceAccountJSON := 'C:\keys\sa.json';
    vGCloud.Connect;
    // vSigner.KeyProvider := vGCloud;
  finally
    vGCloud.Free;
  end;
end;

TsgcHashiCorpVaultKeyProvider

HashiCorp Vault. Silnik sekretów Transit w Vault wykonuje podpisywanie. Najlepszy do self-hosted, sterowanego politykami przechowywania kluczy, gdy Vault jest już częścią stosu.

  • Silnik Transit zarządza tylko kluczem — certyfikat dostarcz przez SetCertificateFromFile.
  • Uwierzytelnianie tokenem; ścieżka montowania domyślnie 'transit'.
vault.pas
var
  vVault: TsgcHashiCorpVaultKeyProvider;
begin
  vVault := TsgcHashiCorpVaultKeyProvider.Create(nil);
  try
    vVault.VaultAddress := 'https://vault.example.com:8200';
    vVault.Token := 's.myVaultToken';
    vVault.MountPath := 'transit';
    vVault.KeyName := 'my-signing-key';
    vVault.Connect;
    vVault.SetCertificateFromFile('C:\certs\signing-cert.pem');
    // vSigner.KeyProvider := vVault;
  finally
    vVault.Free;
  end;
end;

TsgcCertumSimplySignProvider

Certum SimplySign. Polski QTSP. Kwalifikowane podpisy elektroniczne przez PIN autoryzowany w aplikacji mobilnej, bez wymaganego tokenu USB. Popularna opcja dla polskich przepływów pracy KSeF i ZUS.

  • Dane uwierzytelniające klienta OAuth2 + nazwa użytkownika/hasło konta SimplySign + PIN.
  • ListCertificates udostępnia każdy certyfikat dostępny na koncie.
certum.pas
var
  vCertum: TsgcCertumSimplySignProvider;
begin
  vCertum := TsgcCertumSimplySignProvider.Create(nil);
  try
    vCertum.ClientId := 'your-client-id';
    vCertum.ClientSecret := 'your-client-secret';
    vCertum.Username := 'user@example.com';
    vCertum.Password := 'account-password';
    vCertum.PIN := '123456';
    vCertum.BaseURL := 'https://cloudsign.certum.pl';
    vCertum.Connect;
    // vSigner.KeyProvider := vCertum;
  finally
    vCertum.Free;
  end;
end;

TsgcCSCKeyProvider

Cloud Signature Consortium API v2. Ogólny interfejs do dowolnego QTSP implementującego CSC v2 — Universign, D-Trust sign-me, A-Trust, FNMT Cl@ve Firma, Evrotrust, Intesi Group. Dostawca przechowuje kwalifikowany klucz w zdalnym QSCD; sgcSign wysyła tylko skrót dokumentu.

  • Trzy tryby uwierzytelniania: cscBasic, cscOAuth2, cscOTP (jednorazowe hasło dla dwuskładnikowego uwierzytelniania).
  • Wywołuje credentials/authorize + signatures/signHash zgodnie ze specyfikacją CSC v2.
csc-v2.pas
var
  vCSC: TsgcCSCKeyProvider;
  vCreds: TStringArray;
begin
  vCSC := TsgcCSCKeyProvider.Create(nil);
  try
    vCSC.BaseURL := 'https://api.qtsp.example/csc/v2';
    vCSC.AuthMethod := cscBasic;
    vCSC.Username := 'alice';
    vCSC.Password := 'secret';
    vCreds := vCSC.ListCredentials;
    vCSC.CredentialID := vCreds[0];
    vCSC.PIN := '123456';
    vCSC.OTP := '987654';
    vCSC.LoadCredentialInfo;
    // vSigner.KeyProvider := vCSC;
  finally
    vCSC.Free;
  end;
end;

Zmiana jedną linią

Każdy dostawca implementuje IsgcKeyProvider. Kod podpisujący nigdy nie wie, czy klucz znajduje się na dysku, na tokenie, w Azure, czy za API CSC v2.

Jeden podpisywacz, dziesięciu dostawców

  • Programuj z lokalnym PFX. Testuj z magazynem Windows. Wdrażaj do Azure Trusted Signing.
  • Profile krajowe, poziomy podpisu, OCSP, znaczniki czasu — wszystko inne pozostaje bez zmian.
  • Serwer sgcSign używa tych samych dostawców wewnętrznie — najpierw scentralizuj lokalnie, potem skaluj do demona.
swap-providers.pas
function SignWithAnyProvider(
  aProvider: IsgcKeyProvider; const aXML: string): string;
var
  vSigner: TsgcXAdESSigner;
begin
  vSigner := TsgcXAdESSigner.Create(nil);
  try
    vSigner.KeyProvider := aProvider;
    vSigner.Profile.LoadProfile(spEmploymentDE);
    Result := vSigner.SignXML(aXML);
  finally
    vSigner.Free;
  end;
end;

// Caller picks the provider; signer doesn't care.
SignWithAnyProvider(vPFX, vXML);
SignWithAnyProvider(vAzure, vXML);
SignWithAnyProvider(vCSC, vXML);

Wybierz odpowiedniego dostawcę dla swojego modelu zaufania

Od lokalnego .pfx po HSM na innym kontynencie — kod podpisujący pozostaje taki sam.