sgcSign Server

A self-hosted remote code-signing daemon that wraps the sgcSign engine behind a REST API, a Bootstrap web admin console, and ready-made CI/CD pipelines.

REST API + Web Admin
7 Signature Formats
Multi-tenant Projects
Hash-chained Audit Log

What You Get

A single Windows host accepts signing requests from build agents, developers, and CI pipelines — with full audit, approvals, and metrics built in.

REST API

TLS-secured /api/v1 endpoints for signing, verification, health, metrics, and approval workflows. Stable, machine-friendly contract for build agents and SDKs.

Web Admin Console

Bootstrap-based /admin UI for users, API keys, providers, projects, audit, approvals, webhooks, and metrics. Operators never need to edit JSON.

Windows-service Installer

Inno Setup wizard or zip-drop. The daemon registers itself as a Windows service, terminates TLS itself, and runs unattended on a hardened host.

Multi-tenant Projects

Each project isolates a subset of providers, API keys, audit visibility, and approval queues. Several teams share one server without seeing each other's signing material.

Two-step Approval Workflow

The same API key requests, an admin or project admin approves or rejects, and only then are the bytes signed. SHA-256 hash and file size are locked into the request.

SHA-256 Audit Log

Every action — sign, verify, login, approval, webhook fire — is appended to a hash-chained audit log. Tampering is detectable; SIEM scraping is straightforward.

Prometheus Metrics

Sign / verify / approval counters, signing-latency histograms, provider-availability gauges. Direct Prometheus 0.0.4 text exposition with no extra database to manage.

HMAC-signed Webhooks

13 lifecycle events delivered with X-Sgcsign-Signature: sha256=…. Three-attempt retry queue keeps SIEM, chat, and ticketing systems in sync.

XAdES · PAdES · CAdES

The same engine that ships in the library, exposed through the REST API. Every country profile, every signature level.

XAdES

XML signatures for VeriFactu, FatturaPA, Facturae, KSeF, e-Factura, Peppol, myDATA and EU employment contracts. POST /api/v1/sign/xades.

PAdES

PAdES-Basic PDF signatures with incremental updates that preserve original content. Visible or invisible signatures. POST /api/v1/sign/pades.

CAdES

CMS / PKCS#7 detached or attached signatures for arbitrary binary data. Timestamp + long-term validation. POST /api/v1/sign/cades.

Authenticode, ClickOnce, NuGet, VSIX

The signing daemon talks to whichever cert source you configure: Windows store, PFX, PKCS#11 hardware token, Azure Trusted Signing, AWS KMS, Google KMS.

Authenticode

Sign .exe, .dll, .msi, .cab, .cat, .ocx, .sys. Hash-only mode lets low-bandwidth runners exchange a few dozen bytes for an 8 KB PKCS#7 blob.

ClickOnce

Sign ClickOnce manifests (.application / .manifest) so Windows clients install without trust prompts. POST /api/v1/sign/clickonce.

NuGet Packages

Sign .nupkg packages so the NuGet client validates publisher identity. Author and repository signatures supported. POST /api/v1/sign/nuget.

VSIX Extensions

Sign Visual Studio extension packages so VS Marketplace and the IDE itself accept them as trusted. POST /api/v1/sign/vsix.

Drop-in for Every Major Pipeline

Build agents call a stable REST endpoint instead of installing signing certificates on every runner.

GitHub Actions

Composite action posts the artefact to the server's REST API. Token issued by the web admin, scoped to a project, never leaves the runner secret store.

Azure DevOps

Pipeline task runs the sgcSign CLI client, which uploads the binary, polls for approval if required, and downloads the signed result — all in one step.

Jenkins

Declarative-pipeline snippet using curl or the bundled CLI. Works with both Linux and Windows agents; signature appears as a build artefact.

Docker

Image with the daemon and a sample provider config. Run the container, mount your TLS cert + provider secrets, and you have a portable signing service.

Helm Chart

Deploy on Kubernetes for fully redundant, scaled-out signing. Pair with cloud KMS (Azure Trusted Signing, AWS KMS, Google KMS) for keyless pods.

How the Pieces Fit Together

A single Windows service terminates TLS, exposes /api/v1 + /admin, and reaches out to the configured key provider on every call. Key material never lives in the database.

Single binary, three interfaces

  • Build agents hit /api/v1 over HTTPS with a bearer API key.
  • Operators log in to /admin in any browser. Bootstrap UI, session cookies, role-based access.
  • Key providers fetched on demand from PFX, Windows store, PKCS#11, Azure TS, AWS KMS, GCloud KMS, Vault, Certum, CSC v2.
  • SQLite database persists users, API keys, audit log, sessions, webhook queue. Never the key material itself.
  • Webhooks fire asynchronously to SIEM and chat systems on every audited event.
topology.txt
                +----------------------------+
                |   Build agents / CI / CLI  |
                +-------------+--------------+
                              |
                              | HTTPS (TLS 1.2/1.3)
                              v
        +-------------------------------------------+
        |   sgcSignServer.exe   (Windows service)   |
        |   /api/v1/*    (signing, verify, health)  |
        |   /admin/*     (web console, sessions)    |
        +---+-----------------+---------------------+
            |                 |                |
            v                 v                v
     +-------------+   +---------------+   +-----------+
     |  SQLite DB  |   | KeyProviders  |   |  Webhooks |
     | (audit/keys)|   | PFX/HSM/KMS   |   | (outbound)|
     +-------------+   +---------------+   +-----------+

One curl Away

A bearer API key, a multipart upload, and the signed binary streams back to stdout. Authenticode, CAdES, PAdES, XAdES, ClickOnce, NuGet, VSIX share the same shape.

Sign an .exe in one call

  • X-API-Key or Authorization: Bearer — either auth method works.
  • X-Project selects the tenant; the key must be authorised for the project.
  • Response carries X-Sgcsign-Signer-Subject + X-Sgcsign-Duration-Ms for log correlation.
  • Hash-only mode for Authenticode: send the SHA-256, receive a tiny PKCS#7 blob.
sign-binary.sh
# Authenticode-sign MyApp.exe via the REST API
curl -X POST https://sign.example.com/api/v1/sign \
  -H "Authorization: Bearer $TOKEN" \
  -H "X-Project: production" \
  -F "format=authenticode" \
  -F "file=@./MyApp.exe" \
  -o MyApp-signed.exe

# Headers returned by the server
# X-Sgcsign-Signer-Subject: CN=ACME Corp, O=ACME, C=US
# X-Sgcsign-Duration-Ms: 312

Three Steps to a Signed Binary

From a fresh Windows host to the first signed artefact in under five minutes.

1

Install

Run the bundled Inno Setup wizard or drop the zip into a folder. The daemon registers itself as a Windows service called sgcSignServer. Bind to :8443 and load your TLS certificate.

2

Configure a Key Provider

Add a provider to sgcSignServer.conf.json — a PFX file, Azure Trusted Signing account, AWS KMS key, Certum SimplySign user, or any of the other ten key providers. No service restart required.

3

Issue a Token, Call the API

Open /admin/apikeys, click New API key, scope it to a project, copy the token into your CI runner secret. Build agent calls POST /api/v1/sign.

Centralise Signing Across Your Build Farm

Stop copying signing certificates onto every build agent. One sgcSign Server, one REST endpoint, full audit and approvals.