sgcSign 2026.5 — Authenticode、EU eIDAS パック、9 つの雇用プロファイル

· リリース

最初のリリースからわずか 1 か月で、sgcSign 2026.5 はライブラリの大幅な拡張を提供します。本リリースでは、Windows バイナリ向けの Microsoft Authenticode 署名、3 つの新しいコード配布署名機能(ClickOnce、NuGet、VSIX)、完全な EU eIDAS コンプライアンスパック(ASiC コンテナ、LOTL / EUTL 信頼リスト、Cloud Signature Consortium リモート署名)、事前調整済みの 9 か国向け雇用プロファイル、ブルガリアの Peppol BIS Billing 3.0 プロファイル、ネイティブ QR コードジェネレータECDSA P-256/384/521 および RSA-PSS 対応、完全な CI/CD 統合、そして XAdES / PFX 適合性に関する広範な修正が追加されました。

本記事では主要なハイライトを、すぐに貼り付け可能な Delphi のサンプルコードとともにご紹介します。

Microsoft Authenticode

TsgcAuthenticodeSigner は、Authenticode 仕様に準拠して Windows Portable Executable ファイル(.exe.dll.sys)に署名します。この署名機能は PE を解析し、Authenticode アルゴリズムでハッシュを計算し(チェックサムと既存の証明書テーブルをスキップ)、SPC indirect data content を含む完全な PKCS#7 SignedData blob を構築して、バイナリの証明書テーブルに追加します。

SHA-1 から SHA-512 までのハッシュに対応し、RFC 3161 タイムスタンプは unsigned attributes として埋め込まれます。AppendSignature := True により、ネストされた署名(例: 旧版 Windows との互換性のための SHA-1 + SHA-256 デュアル署名)を生成できます。

uses
  sgcSign_Authenticode, sgcSign_KeyProvider_PFX, sgcSign_TSAClient;

var
  oSigner: TsgcAuthenticodeSigner;
  oPFX: TsgcPFXKeyProvider;
  oTSA: TsgcTSAClient;
begin
  oPFX := TsgcPFXKeyProvider.Create(nil);
  oPFX.FileName := 'codesign.pfx';
  oPFX.Password := 'secret';

  oTSA := TsgcTSAClient.Create(nil);
  oTSA.URL := 'http://timestamp.digicert.com';

  oSigner := TsgcAuthenticodeSigner.Create(nil);
  try
    oSigner.KeyProvider := oPFX;
    oSigner.TSAClient   := oTSA;
    oSigner.Hash        := ahSHA256;     // ahSHA1 / ahSHA256 / ahSHA384 / ahSHA512
    oSigner.Level       := alT;          // alBES or alT (with timestamp)
    oSigner.Description := 'My Application';
    oSigner.URL         := 'https://www.example.com';
    oSigner.SignFile('MyApp.exe', 'MyApp-signed.exe');
  finally
    oSigner.Free; oTSA.Free; oPFX.Free;
  end;
end;

検証も同様の流れです。TsgcAuthenticodeVerifier.Verify は、結果、計算済みおよび埋め込みのハッシュ、署名者のサブジェクト/発行者、タイムスタンプの有無を含むレコードを返します。

var
  oVer: TsgcAuthenticodeVerifier;
  oRes: TsgcAuthenticodeVerifyResult;
begin
  oVer := TsgcAuthenticodeVerifier.Create(nil);
  try
    oRes := oVer.Verify('MyApp-signed.exe');
    if oRes.Valid then
      ShowMessage('Signed by ' + oRes.SubjectName)
    else
      ShowMessage('Invalid: ' + oRes.ErrorMessage);
  finally
    oVer.Free;
  end;
end;

ハッシュのみによる Authenticode 署名

大容量の CI アーティファクト(インストーラ、ランタイム、ドライバ)では、リモート署名サービスに PE 全体をアップロードするのは大きな負担となります。新しいハッシュのみによる署名フローでは、クライアントが Authenticode ハッシュをローカルで計算し、32 バイトのダイジェストのみを sgcSign Server に送信します。サーバーは未添付の PKCS#7 blob を返し、クライアントがそれをバイナリに組み込みます — 帯域幅が制限されたエージェントでも、数メガバイトのアップロードを数 KB に削減できます。

// Local: compute the hash with sgcSign_PE_Hasher, POST it to the server,
// receive the SignedData blob, then append it to the PE's certificate table.
var
  oSigner: TsgcAuthenticodeSigner;
  vHash, vPKCS7: TBytes;
begin
  // vHash := ComputePEHash('MyApp.exe', haSHA256);
  vPKCS7 := oSigner.SignHash(vHash, ahSHA256);
  // EmbedPKCS7IntoPE('MyApp.exe', vPKCS7, 'MyApp-signed.exe');
end;

同じ操作は、サーバーの POST /api/v1/sign/authenticode/hash エンドポイント、sgcsign sign --prehash CLI フラグ、および .NET SDK の TsgcSignClient.SignAuthenticodeHashAsync メソッドからも利用できます。

ClickOnce、NuGet、VSIX 署名機能

3 つの新しい署名機能が、Microsoft の開発者向け配布エコシステムをカバーします。

TsgcClickOnceSigner は、エンベロープ形式の W3C XML-DSig を使用して .application デプロイメントマニフェストと .exe.manifest アプリケーションマニフェストに署名し、Microsoft mage.exe の出力と一致します。この署名機能は、証明書の issuerKeyHashpublisherIdentity ノードを書き換えます。

uses sgcSign_ClickOnce;

var oCO: TsgcClickOnceSigner;
begin
  oCO := TsgcClickOnceSigner.Create(nil);
  try
    oCO.KeyProvider   := oPFX;
    oCO.Hash          := haSHA256;
    oCO.PublisherName := 'My Company';
    oCO.SignManifestFile('MyApp.application', 'MyApp-signed.application');
  finally
    oCO.Free;
  end;
end;

TsgcNuGetSigner.nupkg 著者パッケージに署名し、CMS/PKCS#7 SignedData blob(署名証明書 v2、commitment-type "proof of origin")を、オプションの RFC 3161 副署とともに生成します。

uses sgcSign_NuGet;

var oNu: TsgcNuGetSigner;
begin
  oNu := TsgcNuGetSigner.Create(nil);
  try
    oNu.KeyProvider := oPFX;
    oNu.TSAClient   := oTSA;
    oNu.Hash        := haSHA256;
    oNu.SignPackageFile('MyLib.1.0.0.nupkg', 'MyLib.1.0.0.signed.nupkg');
  finally
    oNu.Free;
  end;
end;

TsgcVSIXSigner は、Visual Studio 拡張機能向けに OPC(Open Packaging Convention)デジタル署名を実装し、パートごとの XML-DSig 参照を計算して [Content_Types].xml およびパッケージの _rels/.rels を書き換えます。

uses sgcSign_VSIX;

var oVX: TsgcVSIXSigner;
begin
  oVX := TsgcVSIXSigner.Create(nil);
  try
    oVX.KeyProvider := oPFX;
    oVX.Hash        := haSHA256;
    oVX.SignPackageFile('MyExt.vsix', 'MyExt-signed.vsix');
  finally
    oVX.Free;
  end;
end;

3 つすべてが、既存の XAdES / PAdES / CAdES 署名機能と同じ IsgcKeyProvider インターフェースを再利用するため、請求書署名用に設定された AWS KMS、Azure Trusted Signing、または PKCS#11 トークンを、追加の配線なしでバイナリ署名に再利用できます。

EU eIDAS / コンプライアンスパック

本リリースでは eIDAS パックを導入します — 3 つの新しいユニットを組み合わせることで、Delphi アプリケーションが公式 EU 信頼フレームワークに対して署名を検証し、長期保存用のアーカイブコンテナを生成できるようになります。

ASiC コンテナ(ETSI EN 319 162-1)

sgcSign_ASiC は、XAdES および CAdES の両方の形式で ASiC-S(単一ドキュメント)および ASiC-E(複数ドキュメント)コンテナを構築および解析します。出力は決定論的な ZIP で、mimetype エントリが最初に配置され、署名は META-INF/ 配下に置かれます。

uses sgcSign_ASiC;

var
  oDocs: TsgcASiCDocumentArray;
  vBytes: TBytes;
begin
  SetLength(oDocs, 1);
  oDocs[0].Name := 'invoice.xml';
  oDocs[0].Data := TFile.ReadAllBytes('invoice.xml');

  // aSignatureXML comes from TsgcXAdESSigner (detached signature over the doc)
  vBytes := TsgcASiCContainer.BuildXAdES(apASiCE, oDocs, vXAdESSignature);
  TFile.WriteAllBytes('invoice.asice', vBytes);
end;

LOTL / EUTL 信頼リスト

sgcSign_TrustList は、EU 信頼リスト一覧(List of Trusted Lists)をダウンロードし、加盟国ごとの信頼リストポインターをたどって各 TSPService エントリを解析します。結果として、31 加盟国にまたがる約 3,600 サービスのインメモリカタログが生成されます。IsQualifiedAtTime ルックアップは、指定の署名時刻における任意の証明書を「適格 TSP により発行」として分類します — これは、eIDAS 第 25 条に基づき署名をアドバンスド(AdES)から適格(QES)にアップグレードするために必要な操作です。

Cloud Signature Consortium(CSC v2)

TsgcCSCKeyProvider は、Cloud Signature Consortium API v2 の IsgcKeyProvider 実装です — これは Buypass、Certinomis、Globalsign EU、InfoCert、Namirial、Trust Pro およびその他の QTSP で使用されているリモート適格署名のための欧州標準です。本プロバイダは Basic / OAuth2 / OTP 認証を処理し、ユーザーの資格情報を一覧表示し、証明書チェーンを取得し、SAD 認可を使用してハッシュのみのリモート署名を実行します。

uses sgcSign_KeyProvider_CSC, sgcSign_XAdES;

var oCSC: TsgcCSCKeyProvider; oX: TsgcXAdESSigner;
begin
  oCSC := TsgcCSCKeyProvider.Create(nil);
  oCSC.BaseURL    := 'https://csc.example-qtsp.eu/csc/v2';
  oCSC.AuthMethod := cscOAuth2;
  oCSC.OAuthClientID     := 'my-client-id';
  oCSC.OAuthClientSecret := 'my-client-secret';
  oCSC.CredentialID      := oCSC.ListCredentials[0];
  oCSC.PIN := '1234';
  oCSC.OTP := '987654';      // pushed via SMS / app
  oCSC.LoadCredentialInfo;

  oX := TsgcXAdESSigner.Create(nil);
  oX.KeyProvider := oCSC;
  oX.Profile     := spEIDAS;
  oX.SignXML(vXML);
end;

9 つの雇用プロファイル

欧州の労働法関連文書(雇用契約、給与明細、転籍合意書)を対象とした、事前調整済みの 9 つのプロファイル:

プロファイルレベルC14NTSAOCSP
spEmploymentDEドイツB-LTExclusiveありあり
spEmploymentITイタリアB-LTC14N 1.0ありあり
spEmploymentESスペインB-TExclusiveありなし
spEmploymentFRフランスB-TExclusiveありなし
spEmploymentPLポーランドB-TExclusiveありなし
spEmploymentATオーストリアB-LTExclusiveありあり
spEmploymentBEベルギーB-LTExclusiveありあり
spEmploymentPTポルトガルB-LTExclusiveありあり
spEmploymentNLオランダB-TExclusiveありなし

新しい EU_Employment デモには、完全なパイプライン(署名 → ASiC-E パッケージング → LOTL 検証 → QTSP 分類)が含まれています。

ブルガリア Peppol BIS Billing 3.0

新しい TsgcProfilePeppolBG プロファイルは、ブルガリアの UBL 2.1 請求書(BGN 通貨、20% VAT、BG VAT / EIK、BG IBAN、scheme ID 9926 エンドポイント)に、Exclusive C14N を使用して XAdES B-T で署名します。Delphi および C++Builder のデモには、完全に値が設定された請求書テンプレートが含まれています。

uses sgcSign_XAdES, sgcSign_Types;

var oSigner: TsgcXAdESSigner;
begin
  oSigner := TsgcXAdESSigner.Create(nil);
  try
    oSigner.KeyProvider := oPFX;
    oSigner.TSAClient   := oTSA;
    oSigner.Profile     := spPeppolBG;
    oSigner.SignXMLFile('invoice_bg.xml', 'invoice_bg_signed.xml');
  finally
    oSigner.Free;
  end;
end;

CI/CD 統合

sgcSign Server は、すべての一般的なパイプライン向けにファーストクラスのアーティファクトを提供するようになりました:

QR コードジェネレータ

印刷請求書に QR コードを必要とする TicketBAI、VeriFactu などのプロファイル向けに、新しい sgcSign_QRCode ユニットは、ISO/IEC 18004 をバイトモードで実装した純粋な Pascal ジェネレータを提供します — 4 つの ECC レベルすべて、バージョン 1 から 40、GF(256) Reed-Solomon、完全なマスクペナルティスコアリング — TBitmap レンダラーも付属。外部 DLL なし、ライセンスの心配もありません。

uses sgcSign_QRCode, Graphics;

var
  oMatrix: TQRMatrix;
  oBmp: TBitmap;
begin
  oMatrix := GenerateQRCode(
    'https://tbai.eus/QURL/123456789-A?cr=42',
    qrECM);

  oBmp := TBitmap.Create;
  try
    RenderQRMatrix(oMatrix, oBmp, 5, 4);    // 5 px / module, 4-module border
    oBmp.SaveToFile('invoice_qr.bmp');
  finally
    oBmp.Free;
  end;
end;

ECDSA P-256 / P-384 / P-521 および RSA-PSS

TsgcPEMKeyProvider は、Windows BCrypt CNG(ECCPRIVATEBLOB)経由で EC 秘密鍵をインポートし、XML-DSig 用にロー r||s 出力で署名するようになりました。新しい SignDataPSS メソッドは、BCRYPT_PAD_PSS を使用して RSA-PSS 署名(SHA-256、salt = 32 バイト)を生成します — これは、国の電子請求書プロファイルでますます必要とされている機能です。

検証側では、TsgcSignatureVerifierBCRYPT_ECCPUBLIC_BLOB から EC 公開鍵をインポートし、同じ 3 つの曲線について、XAdES SignatureValue およびロー VerifyData の両方のコードパスで ECDSA 署名を検証します。

これを実現するために、TsgcX509CertificateKeyUsage 拡張を解析し、KeyUsage プロパティに加えて HasKeyUsageDigitalSignature / HasKeyUsageNonRepudiation ヘルパーを通じて公開するようになり、新しい PublicKeyParameters プロパティはロー AlgorithmIdentifier パラメータ TLV(EC 証明書の場合は named-curve OID)を公開します。

Delphi 7 向け WideString オーバーロード

非 ACP テキスト(ポーランドの KSeF、ギリシャの myDATA、ブルガリアの Peppol など)を渡す呼び出し元向けに、公開署名および検証 API は TsgcXAdESSigner.SignXMLSignXMLDetachedSignXMLEnveloping(および TsgcDocumentSignerTsgcSignatureVerifier の対応するメソッド)に WideString オーバーロードを公開するようになりました。これにより、Delphi 7 でロスのない Unicode 入出力が保証され — ACP の往復変換がなくなり — Delphi 2009 以降の string オーバーロードと同等になります。

適合性と信頼性の修正

2026.5 のバグ修正バッチは、実際の税務当局エンドポイントに対して発見された XAdES / PFX / 検証機能の長い問題リストを解消します。

アップグレード

2026.5 は、既存の 2026.4 プロジェクトに対するドロップインアップグレードです。注意すべき唯一の動作変更は TsgcDocumentSigner です。AdES プロファイルに対してプレーンな XML-DSig を出力することに依存していたコードは、これからは正しく XAdES を生成します — これは税務当局が求めていたものですが、統合テストがレガシー出力に固定されていた場合は、ゴールデンファイルを更新する必要があります。

アクティブなサブスクリプションをお持ちのお客様は、カスタマーエリアから新しいビルドをダウンロードできます。トライアルユーザーは、esegece.com/products/sgcsign/sgcsign-download から更新されたインストーラを入手できます。

ご質問、フィードバック、移行のサポートが必要な場合は、お問い合わせください — コードを書いた本人から返信いたします。