키를 직접 가져오세요 — 10가지 공급자

모든 공급자는 IsgcKeyProvider 인터페이스를 구현해요. 동일한 서명 코드가 로컬 파일, 스마트 카드, HSM, 클라우드 KMS, 원격 QTSP에 모두 작동해요. 한 줄만 바꾸면 전환돼요.

로컬 파일 (PFX, PEM)
하드웨어 (PKCS#11)
클라우드 KMS (Azure, AWS, GCP)
QTSP (Certum, CSC v2)

TsgcPFXKeyProvider

PFX / PKCS#12 파일. 로컬 비밀번호 보호 키예요. 개발, 소규모 배포, 인증서가 단일 .pfx/.p12 파일로 제공되는 모든 워크플로에 적합해요.

  • Windows CNG를 통해 PKCS12_PREFER_CNG_KSP로 가져와요. 원래 CSP에 관계없이 SHA-256/384/512 서명이 가능해요.
  • 개인 키가 있는 인증서를 찾을 때까지 멀티 인증서 .pfx 파일을 자동으로 탐색해요.
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

PEM 파일. 네이티브 PBES2 / PBKDF2 / AES-CBC를 지원하는 암호화된 PKCS#8, 그리고 레거시 RSA 개인 키 DEK-Info 형식을 지원해요. OpenSSL 기반 파이프라인에 적합해요.

  • BEGIN CERTIFICATE, BEGIN RSA PRIVATE KEY, BEGIN PRIVATE KEY, BEGIN ENCRYPTED PRIVATE KEY all supported.
  • 결합된 PEM(인증서 + 키가 한 파일)은 자동으로 감지돼요. PrivateKeyFile을 비워두세요.
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

Windows 인증서 저장소. 로컬 컴퓨터 및 현재 사용자 저장소예요. 기존 AD 발급 인증서를 사용하는 데스크톱 앱이나 Windows가 인증서 수명 주기를 이미 관리하는 배포에 적합해요.

  • 서명은 Windows CNG를 통해 이루어져요. 개인 키는 저장소를 절대 벗어나지 않아요.
  • 주체 CN 부분 문자열 또는 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 / 하드웨어 토큰. 스마트 카드, USB 토큰, HSM — SafeNet, YubiKey, Nitrokey, Thales. 대부분의 EU 관할 지역에서 적격 전자 서명에 필요해요.

  • CKM_RSA_PKCS and CKM_ECDSA_SHA256 mechanisms supported.
  • 런타임에 올바른 슬롯을 선택하기 위한 EnumerateSlots / EnumerateCertificates 헬퍼가 제공돼요.
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. Microsoft의 적격 코드 서명 서비스예요. EV 인증서 구매 없이 Authenticode 서명이 가능해요. Microsoft가 인증서를 소유하고 서명 키를 프로비저닝해줘요.

  • OAuth2 클라이언트 자격 증명 — Tenant ID + Client ID + Client Secret.
  • 개인 키는 완전히 Azure에 보관되며, 빌드 에이전트에는 절대 저장되지 않아요.
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. Amazon의 HSM 지원 키 보관 서비스예요. AWS 발급 인증서와 함께 사용하면 개인 키 노출 없이 클라우드 내에서 서명할 수 있어요.

  • AWS Signature Version 4 인증을 프로세스 내에서 계산해요.
  • KeyId는 키 ID, 키 ARN, 또는 별칭 ARN을 허용해요.
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. AWS KMS와 동일한 운영 모델이에요. 서비스 계정 JSON 파일이 JWT 교환을 통해 OAuth2 액세스 토큰으로 인증한 다음, Cloud KMS API를 통해 서명해요.

  • ProjectId + Location + KeyRing + Key + Version — GCP 리소스 계층 구조와 1:1로 일치해요.
  • 비대칭 KMS 키만 지원해요. 가능한 경우 HSM 지원, 그렇지 않으면 소프트웨어 보호로 작동해요.
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. Vault의 Transit 시크릿 엔진이 서명을 수행해요. Vault가 이미 스택에 포함된 자체 호스팅, 정책 기반 키 보관에 적합해요.

  • Transit 엔진은 키만 관리해요. SetCertificateFromFile을 통해 인증서를 제공하세요.
  • 토큰 기반 인증이며, 마운트 경로는 기본값으로 '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. 폴란드 QTSP예요. 모바일 앱 승인 PIN을 통한 적격 전자 서명이 가능하며, USB 토큰이 필요 없어요. 폴란드 KSeF 및 ZUS 워크플로에서 자주 사용해요.

  • OAuth2 클라이언트 자격 증명 + SimplySign 계정 사용자명/비밀번호 + PIN.
  • ListCertificates는 계정에서 사용 가능한 모든 인증서를 노출해요.
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. CSC v2를 구현하는 모든 QTSP에 대한 범용 인터페이스예요 — Universign, D-Trust sign-me, A-Trust, FNMT Cl@ve Firma, Evrotrust, Intesi Group. 공급자는 원격 QSCD에 적격 키를 보관하며, sgcSign은 문서 해시만 전송해요.

  • 세 가지 인증 모드: cscBasic, cscOAuth2, cscOTP (이중 인증용 일회용 비밀번호).
  • CSC v2 사양에 따라 credentials/authorize + signatures/signHash를 호출해요.
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;

한 줄로 교체하기

모든 공급자는 IsgcKeyProvider를 구현해요. 서명 코드는 키가 디스크, 토큰, Azure, CSC v2 API 뒤에 있는지 알 필요가 없어요.

서명자 하나, 공급자 열 개

  • 로컬 PFX로 개발하고, Windows 저장소로 테스트하고, Azure Trusted Signing으로 배포해요.
  • 국가 프로파일, 서명 수준, OCSP, 타임스탬프 — 나머지는 모두 그대로예요.
  • sgcSign 서버는 내부적으로 동일한 공급자를 사용해요. 먼저 로컬에서 중앙화하고 나중에 데몬으로 확장하세요.
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);

신뢰 모델에 맞는 공급자를 선택하세요

로컬 .pfx부터 다른 대륙의 HSM까지 — 서명 코드는 동일하게 유지돼요.