跳到主要内容
版本:V2.2.1

Windows Provider

sslTrus 提供 KSP(Key Storage Provider)CSP(Cryptographic Service Provider) 两种 Windows Provider 集成方式。

通过 Windows Provider,可以让 Microsoft SignTool、Visual Studio、MSBuild、安装包工具以及其他支持 Windows 密码学接口的软件使用 sslTrus 云端代码签名能力。

签名私钥始终保存在云端 HSM 中,不需要将私钥文件部署到本地计算机。

KSP 和 CSP 的安装、配置和维护均通过 sslTrus SignTool CLI 完成,可从 sslTrus 客户端发布页 下载。

KSP 与 CSP

KSP 和 CSP 分别对应 Windows 的两代密码学接口:

ProviderWindows 接口适用场景
KSPCNG(Cryptography API: Next Generation)现代 Windows 应用和签名工具,优先选择
CSPCryptoAPI传统应用或明确要求使用 CSP 的软件

对于新的 Windows 集成场景,通常优先使用 KSP

只有当目标软件不支持 KSP,或者明确要求使用传统 CryptoAPI Provider 时,再使用 CSP

KSP

KSP 是基于 Windows CNG 的 Key Storage Provider。

安装 sslTrus KSP 后,支持 CNG 的 Windows 应用可以通过标准 Windows 密钥接口调用远程代码签名服务。

本地 Provider 负责接收应用程序发起的签名请求,并将需要签名的摘要发送到远程代码签名服务;实际私钥操作在云端 HSM 中完成。

适用场景

KSP 适用于:

  • Microsoft SignTool。
  • Visual Studio。
  • MSBuild。
  • 支持 Windows CNG 的构建和签名软件。
  • 需要通过标准 Windows Provider 接入远程私钥的应用。

安装 KSP

在管理员终端执行:

signtool ksp install

该命令会安装并注册:

sslTrus Key Storage Provider

KSP 安装涉及系统 Provider 注册以及 Windows 系统目录,因此通常需要管理员权限。

添加证书配置

执行:

signtool ksp add

根据提示输入:

Access Key
Access Secret
Certificate Code

客户端会从远程代码签名服务获取对应证书,并保存远程服务地址、访问凭证和证书配置。

如果使用 NICSRS(www.nicsrs.com)环境,需要添加 --address nicsrs

signtool ksp add --address nicsrs

注册证书

完成 KSP 配置后,需要将代码签名证书注册到 Windows 证书库并关联 KSP Provider。

执行:

signtool ksp register

默认注册到当前用户的个人证书库。

如果需要注册到 LocalMachine 证书库:

signtool ksp register --store local-machine

注册完成后,Windows 会将对应证书识别为具有可用私钥,但实际私钥仍然保存在云端 HSM。

使用 Microsoft SignTool

KSP 配置完成后,可以使用 Windows SDK 提供的 Microsoft signtool.exe 对文件进行签名。

例如:

signtool.exe sign /v ^
/csp "sslTrus Key Storage Provider" ^
/kc CERT_CODE ^
/f "C:\ProgramData\sslTrusKSP\CERT_CODE.crt" ^
/fd SHA256 ^
/tr http://timestamp.acs.microsoft.com ^
/td SHA256 ^
".\app.exe"

主要参数:

参数说明
/csp指定 sslTrus KSP Provider
/kc指定证书编号对应的密钥容器
/f指定代码签名证书
/fd指定文件摘要算法
/tr指定 RFC 3161 时间戳服务器
/td指定时间戳摘要算法

如果需要在已有签名基础上追加 SHA-1 签名,可以使用 /as 参数:

signtool.exe sign /v ^
/csp "sslTrus Key Storage Provider" ^
/kc CERT_CODE ^
/f "C:\ProgramData\sslTrusKSP\CERT_CODE.crt" ^
/fd SHA1 ^
/tr http://timestamp.acs.microsoft.com ^
/td SHA256 ^
/as ^
".\app.exe"

Microsoft signtool.exe 会通过 Windows CNG 调用 sslTrus KSP,再由 KSP 完成远程私钥签名。

管理 KSP

查看已经配置的 KSP:

signtool ksp list

删除配置:

signtool ksp del

解除证书与 KSP 的关联:

signtool ksp deregister

卸载 KSP:

signtool ksp uninstall

卸载 Provider 前,应确认没有其他 Windows 应用仍依赖该 Provider。

CSP

CSP 是传统 Windows CryptoAPI 使用的 Cryptographic Service Provider。

它主要用于需要通过 /csp/kc 参数指定 Provider 与密钥容器的 Windows 签名流程。sslTrus CSP 由客户端负责安装和维护,实际文件签名仍由 Windows SDK 的 Microsoft signtool.exe 完成。

适用场景

CSP 适用于:

  • 仅支持传统 CryptoAPI 的 Windows 软件。
  • 明确要求指定 CSP Provider 的签名工具。
  • 需要通过 Microsoft SignTool /csp/kc 参数执行签名的环境。
  • 无法使用 Windows CNG / KSP 的旧版应用。

对于能够正常使用 KSP 的新系统,一般不需要额外使用 CSP。

安装 CSP

在管理员终端执行:

signtool csp install

安装过程中会注册:

sslTrus Cryptographic Service Provider

并将 Provider DLL 安装到 Windows 系统中。

CSP Provider 类型为:

PROV_RSA_AES

本地配置默认保存在:

%ProgramData%\sslTrusKSP

配置文件使用 Windows DPAPI 进行保护。

如果需要同时安装 KSP,可以执行:

signtool csp install --with-ksp

添加证书配置

执行:

signtool csp add

根据提示输入:

Access Key
Access Secret
Certificate Code

添加完成后,客户端会下载对应证书并保存到:

%ProgramData%\sslTrusKSP\CERT_CODE.crt

其中 CERT_CODE 同时作为远程证书标识和后续 Microsoft SignTool 使用的密钥容器名称。

如果使用 NICSRS(www.nicsrs.com)环境,需要添加 --address nicsrs

signtool csp add --address nicsrs

注册证书

默认将证书注册到当前用户的个人证书库:

signtool csp register

如果需要注册到 LocalMachine:

signtool csp register --store local-machine

支持的证书库包括:

参数Windows 证书库
current-userCurrentUser\My
local-machineLocalMachine\My

注册完成后,Windows 证书管理器会显示对应证书具有私钥关联,但私钥实际仍位于云端 HSM。

使用 Microsoft SignTool

CSP 签名时,需要显式指定 Provider、密钥容器和证书文件:

signtool.exe sign /v ^
/csp "sslTrus Cryptographic Service Provider" ^
/kc CERT_CODE ^
/f "C:\ProgramData\sslTrusKSP\CERT_CODE.crt" ^
/fd SHA256 ^
/tr http://timestamp.acs.microsoft.com ^
/td SHA256 ^
".\app.exe"

主要参数:

参数说明
/csp指定 sslTrus CSP Provider
/kc指定证书编号对应的密钥容器
/f指定代码签名证书
/fd指定文件摘要算法
/tr指定 RFC 3161 时间戳服务器
/td指定时间戳摘要算法

sslTrus CSP 支持 SHA1、SHA256、SHA384 和 SHA512 摘要算法,新签名场景通常应使用 SHA-256 或更高强度算法。

验证签名

签名完成后,可以使用 Microsoft SignTool 验证:

signtool.exe verify /pa /v ".\app.exe"

验签不会重新调用远程私钥,也不会产生新的签名次数。

管理 CSP

查看已有配置:

signtool csp list

删除某个证书配置:

signtool csp del

解除证书与 CSP 的私钥关联:

signtool csp deregister

卸载 Provider:

signtool csp uninstall

删除 CSP 配置不会自动删除已经下载的证书文件。如果相关证书和配置已经不再使用,应在确认没有其他 Provider 依赖后再进行清理。

KSP 还是 CSP

如果没有特殊兼容性要求,可以按照下面的方式选择:

场景建议
新的 Windows 签名环境KSP
支持 Windows CNGKSP
Microsoft SignTool 等现代 Windows 工具KSP
软件明确要求 CSPCSP
传统 CryptoAPI 应用CSP
工具要求使用 /csp/kcCSP

KSP 和 CSP 的主要区别在于 Windows 使用的密码学 Provider 接口不同,远程私钥安全模型保持一致。

无论使用 KSP 还是 CSP,代码签名私钥都不会保存到本地客户端。

签名次数

Windows Provider 的签名次数按照底层实际完成的远程签名动作计算。

例如:

SHA256 签名一次 = 1 次

如果对同一个文件先完成 SHA256 签名,再追加另外一次签名,则会再次触发远程私钥操作,因此需要分别计算。

KSP 场景下,同一个文件执行 SHA256 和 SHA1 双签通常会产生两次底层签名调用。

具体规则请参阅 参考资料

时间戳

Windows Authenticode 签名通常建议添加可信时间戳。

现代代码签名场景建议优先使用 RFC 3161 时间戳,例如:

http://timestamp.acs.microsoft.com

实际生产环境应根据目标 Windows 版本、证书策略、网络环境以及时间戳服务商要求选择合适的 TSA。

具体时间戳服务器和协议说明请参阅 参考资料

安全说明

使用 Windows Provider 时需要注意:

  • Access Secret 应作为敏感凭证进行保护。
  • 不要将访问凭证写入公开脚本或日志。
  • Provider 配置文件不应公开传播。
  • 本地证书文件不包含代码签名私钥。
  • 代码签名私钥始终保存在云端 HSM。
  • KSP/CSP 发起签名时需要能够访问远程代码签名服务。
  • 使用 LocalMachine 证书库时,应特别注意 Windows 用户权限和凭证访问范围。

CSP 的 config.dat 使用当前 Windows 用户 Profile 的 DPAPI 进行保护,将证书注册到 LocalMachine 并不会自动改变该配置的 DPAPI 保护范围。