sgcSign 服务器
一个自托管远程代码签名守护进程,将 sgcSign 引擎封装在 REST API、Bootstrap Web 管理台和用于 CI/CD 流水线的命令行客户端背后。
一个自托管远程代码签名守护进程,将 sgcSign 引擎封装在 REST API、Bootstrap Web 管理台和用于 CI/CD 流水线的命令行客户端背后。
单台 Windows 或 Linux 主机接受来自构建代理、开发者和 CI 流水线的签名请求——内置完整审计、审批和指标功能。
TLS 加密的 /api/v1 端点,用于签名、验证、健康检查、指标和审批工作流。为构建代理和 SDK 提供稳定、机器友好的接口。
基于 Bootstrap 的 /admin UI,用于管理用户、API 密钥、提供者、项目、审计、审批、Webhook 和指标。运营者无需编辑 JSON。
Inno Setup 向导或 zip 解压安装。守护进程自我注册为 Windows 服务,自行终止 TLS,在加固的主机上无人值守运行。
每个项目隔离一组提供者、API 密钥、审计可见性和审批队列。多个团队共享一台服务器,互不查看对方的签名材料。
同一 API 密钥发起请求,管理员或项目管理员批准或拒绝,之后才对字节进行签名。SHA-256 哈希和文件大小被锁定到请求中。
每个操作——签名、验证、登录、审批、Webhook 触发——都追加到哈希链审计日志中。篡改可被检测;SIEM 抓取简单直接。
签名/验证/审批计数器、签名延迟直方图、提供者可用性仪表。直接 Prometheus 0.0.4 文本格式输出,无需管理额外数据库。
21 个生命周期事件通过 X-Sgcsign-Signature: sha256=… 发送。三次重试队列保持 SIEM、聊天和工单系统同步。
与组件库相同的引擎,通过 REST API 公开。支持每个国家配置文件,每个签名等级。
用于 VeriFactu、FatturaPA、Facturae、KSeF、e-Factura、Peppol、myDATA 和 EU 劳动合同的 XML 签名。POST /api/v1/sign/xades。
PAdES-Basic PDF 签名,增量更新保留原始内容。支持可见或不可见签名。POST /api/v1/sign/pades。
针对任意二进制数据的 CMS / PKCS#7 分离或附属签名。时间戳 + 长期验证。POST /api/v1/sign/cades。
使用服务器持有的密钥构建并签名一笔登记的销售,可选择将其提交给税务机构并返回应答。连锁门店的多台收银机共用同一张纳税人证书。POST /api/v1/sign/eet。
签名守护进程与您配置的任何证书源通信:Windows 存储、PFX、PKCS#11 硬件令牌、Azure Trusted Signing、AWS KMS、Google KMS。
对 .exe、.dll、.msi、.cab、.cat、.ocx、.sys 签名。纯哈希模式使低带宽运行器只需传输几十字节即可获得 8 KB PKCS#7 数据块。添加 --page-hashes(API 中为 page_hashes)即可为内核模式驱动程序加入页面哈希,与 signtool /ph 相同。
对 ClickOnce 清单(.application / .manifest)签名,使 Windows 客户端安装时无需信任提示。POST /api/v1/sign/clickonce。
对 .nupkg 包签名,使 NuGet 客户端验证发布者身份。支持作者签名和仓库签名。POST /api/v1/sign/nuget。
对 Visual Studio 扩展包签名,使 VS Marketplace 和 IDE 本身将其视为可信。POST /api/v1/sign/vsix。
更强的管理控制台登录和磁盘上加密的机密,即使密码被盗或配置文件被复制,也无法打开签名密钥。
控制台账户可添加来自任意 TOTP 验证器应用的 6 位验证码,并提供 10 个一次性恢复码以应对手机丢失。设置 admin.require_2fa 后,每个控制台用户必须先完成注册才能访问其他页面。管理员可以重置丢失的第二因素。
使用 Microsoft Entra ID、Okta、Keycloak、Google 或任何标准 OpenID Connect 提供商登录控制台,采用带 PKCE 的授权码流程。用户可将外部身份关联到自己的账户,新用户还可以申请由管理员批准的账户。
每个响应都带有安全标头和严格的内容安全策略(Content Security Policy)。提供可配置的密码策略、必须在首次登录时更换的临时密码,并且一旦会话背后的角色或权限发生变化,会话立即结束。
提供商密码、PIN、云凭据和 Webhook 密钥使用 AES-256-GCM 加密存储,主密钥与本机绑定(Windows 上为 DPAPI)。sgcSignServer --protect-secrets 可就地加密现有配置。
由服务器决定谁可以签名、使用哪个密钥以及需要谁的批准,即使某个时间戳服务器宕机,每个签名也都能获得时间戳。
将某个提供商或整个项目标记为需要审批后,服务器会以 approval_required 拒绝直接签名。每次审批只能签名一次。该规则适用于所有签名路径,包括用于 signtool /dlib 的原始摘要签名。
重新生成密钥时,旧密钥最多可继续使用 7 天;还可以修改其到期时间、查看所有者,并将其限制在允许的提供商列表内。启用 api_keys.self_service 后,操作员可以在您设定的限制内创建并管理自己的密钥。 密钥也可以从首次使用时才开始生效:自首次通过身份验证的调用起有效 N 天,并且必须设置“激活截止”日期,因此从未使用的密钥不会永久有效。子密钥只有在其父密钥已激活后才能使用,激活会以 apikey.activate 记录在审计日志中,Community 版将这两个值都限制为 30 天。
服务器按令牌统计 PIN 错误结果,并在达到 max_pin_attempts 后停止登录,因此配置中的错误 PIN 不会锁定硬件令牌。只有设置 allow_final_pin_try 才会使用最后一次尝试,管理员可在控制台中重置该保护。
sgcsign config 将服务器、提供商和其他设置保存在命名配置文件中,sgcsign auth set-key 保存 API 密钥,构建脚本无需再重复这些参数。Delphi CLI 与 .NET 工具 esegece.sgcsign.cli 共用相同的文件。
tsa_urls 列表,对不得加时间戳的请求可使用 no_timestamp。
sgcsign timestamp 可为已经 Authenticode 签名的文件添加时间戳,并采用相同的回退机制。
# sgcSignServer.conf.json
"timestamp": {
"servers": ["http://timestamp.digicert.com", "http://timestamp.sectigo.com"],
"timeout_ms": 30000
}
# Timestamp a file that is already signed
sgcsign timestamp MyApp.exe --tsa http://timestamp.digicert.com --tsa http://timestamp.sectigo.com
让服务器多年稳定运行:加密备份、证书到期前预警、需要人工处理时发送电子邮件,以及 Windows 安装程序。
一个归档文件包含配置、数据库、主密钥以及所有密钥和证书文件,并使用口令以 AES-256-GCM 加密。归档可按计划或从控制台运行,sgcSignServer --archive restore 可在同一台机器上重建服务器,或将其迁移到新机器。
签名证书和服务器的 TLS 证书会在启动时以及每天检查。剩余 30、14、7 和 1 天时的警告会显示在仪表板上,并通过 cert.expiring Webhook、电子邮件和 sgcsign_certificate_not_after_seconds 指标发出。
账户被锁定、双因素认证或密码更改、备份失败或证书即将到期时发送电子邮件。支持带 STARTTLS 或隐式 TLS 的 SMTP,在 Windows 上邮件发送器无需 OpenSSL 库。
sgcSignServer_Setup.exe 将服务器安装为 Windows 服务,创建第一个管理员并开放防火墙端口。TLS 可使用生成的自签名证书、现有的 PFX 文件,测试机器也可使用普通 HTTP。
单个 Windows 服务终止 TLS,公开 /api/v1 + /admin,每次调用时访问配置的密钥提供者。密钥材料永远不存储在数据库中。
/api/v1。
/admin。Bootstrap UI、会话 Cookie、基于角色的访问控制。
+----------------------------+
| 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)|
+-------------+ +---------------+ +-----------+
curl 命令即可完成一个 Bearer API 密钥、一个哈希或文件上传,已签名的二进制文件流式返回到标准输出。Authenticode、CAdES、PAdES、XAdES、ClickOnce、NuGet、VSIX 共享相同的形式。
X-API-Key 或 Authorization: Bearer——两种认证方式均可使用。
X-Project 选择租户;密钥必须授权用于该项目。
X-Sgcsign-Signer-Subject + X-Sgcsign-Duration-Ms 用于日志关联。
# 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
从全新 Windows 主机到第一个已签名制品,不超过五分钟。
运行内置 Inno Setup 向导,或将 zip 解压到文件夹。守护进程自我注册为名为 sgcSignServer 的 Windows 服务。绑定到 :8443 并加载您的 TLS 证书。
向 sgcSignServer.conf.json 添加提供者——PFX 文件、Azure Trusted Signing 账户、AWS KMS 密钥、Certum SimplySign 用户,或其他任何密钥提供者。无需重启服务。
打开 /admin/apikeys,点击新建 API 密钥,将其限定于某个项目,将令牌复制到 CI 运行器密钥中。构建代理调用 POST /api/v1/sign。