最初のリリースからわずか 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 の出力と一致します。この署名機能は、証明書の issuerKeyHash で publisherIdentity ノードを書き換えます。
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 つのプロファイル:
| プロファイル | 国 | レベル | C14N | TSA | OCSP |
|---|---|---|---|---|---|
spEmploymentDE | ドイツ | B-LT | Exclusive | あり | あり |
spEmploymentIT | イタリア | B-LT | C14N 1.0 | あり | あり |
spEmploymentES | スペイン | B-T | Exclusive | あり | なし |
spEmploymentFR | フランス | B-T | Exclusive | あり | なし |
spEmploymentPL | ポーランド | B-T | Exclusive | あり | なし |
spEmploymentAT | オーストリア | B-LT | Exclusive | あり | あり |
spEmploymentBE | ベルギー | B-LT | Exclusive | あり | あり |
spEmploymentPT | ポルトガル | B-LT | Exclusive | あり | あり |
spEmploymentNL | オランダ | B-T | Exclusive | あり | なし |
新しい 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 は、すべての一般的なパイプライン向けにファーストクラスのアーティファクトを提供するようになりました:
- GitHub Actions — ハッシュのみによる Authenticode 署名を備えた複合 Action。
- Azure DevOps — secure-file 統合を備えたネイティブタスク。
- Jenkins — 宣言的パイプライン DSL と共有ライブラリ。
- Docker — Windows Server Core イメージと
docker-composeファイル。 - Helm — 高可用性 sgcSign Server 向け Kubernetes チャート。
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 バイト)を生成します — これは、国の電子請求書プロファイルでますます必要とされている機能です。
検証側では、TsgcSignatureVerifier が BCRYPT_ECCPUBLIC_BLOB から EC 公開鍵をインポートし、同じ 3 つの曲線について、XAdES SignatureValue およびロー VerifyData の両方のコードパスで ECDSA 署名を検証します。
これを実現するために、TsgcX509Certificate は KeyUsage 拡張を解析し、KeyUsage プロパティに加えて HasKeyUsageDigitalSignature / HasKeyUsageNonRepudiation ヘルパーを通じて公開するようになり、新しい PublicKeyParameters プロパティはロー AlgorithmIdentifier パラメータ TLV(EC 証明書の場合は named-curve OID)を公開します。
Delphi 7 向け WideString オーバーロード
非 ACP テキスト(ポーランドの KSeF、ギリシャの myDATA、ブルガリアの Peppol など)を渡す呼び出し元向けに、公開署名および検証 API は TsgcXAdESSigner.SignXML、SignXMLDetached、SignXMLEnveloping(および TsgcDocumentSigner と TsgcSignatureVerifier の対応するメソッド)に WideString オーバーロードを公開するようになりました。これにより、Delphi 7 でロスのない Unicode 入出力が保証され — ACP の往復変換がなくなり — Delphi 2009 以降の string オーバーロードと同等になります。
適合性と信頼性の修正
2026.5 のバグ修正バッチは、実際の税務当局エンドポイントに対して発見された XAdES / PFX / 検証機能の長い問題リストを解消します。
TsgcDocumentSignerは、AdES プロファイルに対して正しく XAdES を生成するようになりました。内部的には、sfXAdESパスではTsgcXAdESSignerに委譲し、sfPAdES/sfCAdESでは明確なエラーを発生させます(専用の署名機能を使用してください)。新しく公開されたFormat: TsgcSignatureFormatプロパティ(デフォルトsfXAdES)により、選択が明示的になります。以前のバージョンでは、プロファイルに関係なくプレーンな XML-DSig を生成していたため、国の電子請求書サービスから拒否されていました。TsgcPFXKeyProviderに新しく公開されたHashAlgorithmプロパティ(デフォルトhaSHA256)が追加され、TsgcXAdESSignerはアクティブなプロファイルのハッシュを PFX プロバイダにプッシュするようになりました。FacturaeB2B 署名された PFX バックエンドの請求書は、これにより正しく RSA-SHA1 となり、FACe INVALID_INVOICE-122 «los datos de la firma no son correctos» 拒否を修正します。TsgcPFXKeyProviderはモダンな P12 ファイルに対応するようになりました:PKCS12_PREFER_CNG_KSP、マルチ証明書の繰り返し探索、2 段階の取得(ONLY_NCRYPT後にPREFER_NCRYPT)、およびNCryptSignHash経由の CNG 署名。- XAdES KSeF / ETSI 適合性 — V1
SigningCertificateラッパー、条件付きSignaturePolicyIdentifier発行、10 進数のX509SerialNumber、シングルビルドSignedProperties(クロックレース修正)、SignedProperties参照に対する明示的な exc-c14n 変換、および新しいSignatureParentElementプロパティ。TsgcSignatureVerifierは、要素 Id ルックアップでURI=#<Id>を解決するようになりました。 - X.509 拡張解析 — v3
[3] EXPLICIT Extensionsタグの内容が二重ラップされており、すべての証明書でKeyUsage、ExtendedKeyUsage、AIA、CDP、SubjectAltName、BasicConstraints が暗黙的にスキップされていました。修正済み。 - 自己閉じ XML タグ —
ExtractFullElementは<ds:DigestMethod Algorithm="…/sha1"/>を正しく処理するようになりました。以前のバージョンはデフォルトで SHA-256 となり、"Digest length mismatch for Reference 0" エラーで FacturaeB2B 検証を破壊していました。 - Inclusive C14N フォールバック —
TsgcSignatureVerifierは、XML-DSig §4.3.3.2 に従い、明示的な変換を省略するフラグメント / 空 URI 参照に暗黙的な inclusive C14N を適用します。inclusive-C14N プロファイル(FacturaeB2B)の KeyInfo および body 参照における "Digest value mismatch" を修正します。 - PEM の堅牢化 — Unicode
ReadFileContent修正、2 段階 PKCS#8 デコード、AT_KEYEXCHANGEキースペック、GUID 接尾辞付き CSP コンテナ、BCrypt 経由のネイティブ暗号化 PKCS#8(PBES2 / PBKDF2 / AES-CBC)、LoadCertificateOnlyおよび EC マーカー認識。 - デザイン時のハウスキーピング — 9 つの署名機能 / 検証機能コンポーネントすべてが、
Notification(opRemove)経由でリンクされた参照を自動的にクリアするようになり、フォームから鍵プロバイダや TSA クライアントが削除された際のダングリングポインタが解消されました。 - ビルドの整備 —
sgcSign_ASiCの W1000(UTF8Decode)警告は{$IFDEF UNICODE} UTF8ToStringフォールバックで修正、sgcSign_XAdESとsgcSign_TrustListの H2077 / H2219 デッドコード警告も整理されました。
アップグレード
2026.5 は、既存の 2026.4 プロジェクトに対するドロップインアップグレードです。注意すべき唯一の動作変更は TsgcDocumentSigner です。AdES プロファイルに対してプレーンな XML-DSig を出力することに依存していたコードは、これからは正しく XAdES を生成します — これは税務当局が求めていたものですが、統合テストがレガシー出力に固定されていた場合は、ゴールデンファイルを更新する必要があります。
アクティブなサブスクリプションをお持ちのお客様は、カスタマーエリアから新しいビルドをダウンロードできます。トライアルユーザーは、esegece.com/products/sgcsign/sgcsign-download から更新されたインストーラを入手できます。
ご質問、フィードバック、移行のサポートが必要な場合は、お問い合わせください — コードを書いた本人から返信いたします。
