キーを持ち込む — 10 種類のプロバイダー

すべてのプロバイダーは IsgcKeyProvider インターフェースを実装しています。同じ署名コードがローカルファイル、スマートカード、HSM、クラウド KMS、リモート QTSP に対して動作します。1 行で切り替え可能です。

Local Files (PFX, PEM)
Hardware (PKCS#11)
Cloud KMS (Azure, AWS, GCP)
QTSPs (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(証明書とキーが 1 ファイル)は自動検出されます。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 client credentials — 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 authentication, computed in-process.
  • 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 client credentials + SimplySign account username/password + 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 はドキュメントハッシュのみを送信します。

  • 3 つの認証モード:cscBasiccscOAuth2cscOTP(二要素認証用のワンタイムパスワード)。
  • 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;

1 行で切り替え可能

すべてのプロバイダーは IsgcKeyProvider を実装しています。署名コードは、キーがディスク上にあるのか、トークン上なのか、Azure なのか、CSC v2 API の背後なのかを知る必要はありません。

1 つのサイナー、10 種類のプロバイダー

  • ローカル PFX で開発。Windows ストアでテスト。Azure Trusted Signing にデプロイ。
  • 国別プロファイル、署名レベル、OCSP、タイムスタンプ — それ以外はすべて同じまま。
  • sgcSign Server は内部で同じプロバイダーを使用しています。まずローカルで集約し、後でデーモンにスケールアップできます。
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 まで — 署名コードは変わりません。