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 的两代密码学接口:
| Provider | Windows 接口 | 适用场景 |
|---|---|---|
| KSP | CNG(Cryptography API: Next Generation) | 现代 Windows 应用和签名工具,优先选择 |
| CSP | CryptoAPI | 传统应用或明确要求使用 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-user | CurrentUser\My |
local-machine | LocalMachine\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 CNG | KSP |
| Microsoft SignTool 等现代 Windows 工具 | KSP |
| 软件明确要求 CSP | CSP |
| 传统 CryptoAPI 应用 | CSP |
工具要求使用 /csp 和 /kc | CSP |
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 保护范围。