SignTool数字签名工具包详解与实战

该文章已生成可运行项目,

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:数字签名是保障数据完整性和来源真实性的重要技术,在软件发布、驱动安装和代码保护中具有关键作用。SignTool是微软提供的专业数字签名工具,支持签名、验证、时间戳和证书信息查看等功能。本文详细解析SignTool的使用流程与数字签名原理,并通过批处理脚本简化签名操作,帮助开发者掌握软件签名、驱动签名及代码签名的完整实践方法,提升软件发布的安全性和可信度。
SignTool 数字签名 工具包

1. 数字签名技术原理详解

数字签名是现代信息安全体系中的核心技术之一,它通过结合哈希算法与非对称加密技术,确保数据的完整性、身份验证与不可否认性。其基本流程包括:发送方使用哈希算法生成数据摘要,再通过私钥对摘要进行加密形成数字签名;接收方则使用发送方的公钥解密签名,并重新计算哈希值进行比对,从而验证数据是否被篡改。

本章将深入解析数字签名背后的核心技术,包括公钥基础设施(PKI)体系的构建、常见哈希算法(如SHA-256)的作用、非对称加密(如RSA)的工作原理,以及签名生成与验证的完整流程。通过这些内容,读者将全面理解数字签名在保障软件发布、电子合同、身份认证等场景中的关键作用。

2. SignTool工具核心功能介绍

SignTool 是 Windows SDK 中提供的一个命令行工具,广泛用于对 PE 文件(如 EXE、DLL、SYS)、MSI 安装包、CAB 压缩包等进行数字签名和验证操作。作为软件开发者和发布人员,掌握 SignTool 的核心功能对于确保软件的完整性和可信性至关重要。本章将从工具的基本组成、支持的签名类型与格式、常用命令与参数三个方面深入解析 SignTool 的核心功能,帮助读者全面理解其在软件签名流程中的应用。

2.1 SignTool的基本组成与安装配置

SignTool 是 Windows SDK 的一部分,通常随 Visual Studio 或 Windows SDK 安装包一同安装。其核心组件包括命令行工具 signtool.exe 和一组用于签名、验证、时间戳等功能的底层 API。

2.1.1 Windows SDK中的SignTool组件

SignTool 是 Windows SDK 提供的代码签名工具之一,位于 SDK 安装路径下的 bin 子目录中。其主要组件如下:

组件名称 说明
signtool.exe 核心命令行工具,用于执行签名、验证等操作
mssign32.dll Microsoft 提供的签名服务组件
x86/x64/arm 子目录 包含不同平台架构的签名工具版本
timestamp 支持模块 用于添加 RFC 3161 时间戳服务

在 Windows SDK 中,SignTool 依赖于操作系统提供的 Cryptography API(CryptoAPI)和证书管理功能。因此,使用 SignTool 前需确保系统中已正确安装并配置了证书。

2.1.2 环境变量配置与命令行调用方式

要使用 SignTool,首先需要将其路径添加到系统的环境变量中,以便在任意位置调用。

步骤 1:查找 SignTool 安装路径

通常路径为:

C:\Program Files (x86)\Windows Kits\10\bin\10.0.XXXXX.0\x64

其中 10.0.XXXXX.0 为具体版本号。

步骤 2:配置环境变量
  1. 打开“系统属性” > “高级系统设置” > “环境变量”。
  2. 在“系统变量”中找到 Path ,点击“编辑”。
  3. 添加 SignTool 的路径到 Path 变量中。
步骤 3:命令行验证

打开命令提示符(CMD)并输入:

signtool /?

如果输出如下内容,则说明配置成功:

SignTool 10.0.XXXXX.0 - Windows (R) Code Signing Tool
Usage: signtool <command> [options] [files]
Commands:
  sign     - Sign files.
  verify   - Verify signed files.
  info     - Display information about a signed file.
  timestamp - Add a timestamp to a signature.

Mermaid 流程图:SignTool 安装与配置流程

graph TD
    A[安装 Windows SDK 或 Visual Studio] --> B[查找 signtool.exe 路径]
    B --> C[将路径添加到系统环境变量 Path]
    C --> D[打开 CMD,输入 signtool /? 验证]
    D --> E{是否显示帮助信息?}
    E -->|是| F[配置成功]
    E -->|否| G[检查路径是否正确,重新配置]

2.2 SignTool支持的签名类型与格式

SignTool 支持多种文件格式的数字签名,主要包括 PE 文件、MSI 安装包、CAB 压缩包以及部分脚本文件。这些签名格式广泛应用于 Windows 平台的软件发布流程中。

2.2.1 PE文件签名(EXE、DLL、SYS等)

PE(Portable Executable)是 Windows 系统的标准可执行文件格式。SignTool 支持对以下类型的 PE 文件进行签名:

  • .exe :可执行文件
  • .dll :动态链接库
  • .sys :驱动程序
  • .ocx :ActiveX 控件
示例命令:对 EXE 文件签名
signtool sign /f mycert.pfx /p password /t http://timestamp.digicert.com myapp.exe

参数说明:

  • /f mycert.pfx :指定签名证书文件
  • /p password :证书私钥的密码
  • /t :添加时间戳服务器地址
  • myapp.exe :待签名的文件

2.2.2 MSI安装包与CAB压缩包签名

MSI(Microsoft Installer)安装包和 CAB(Cabinet)压缩包也常用于软件分发。SignTool 同样支持对这些文件进行签名。

示例命令:对 MSI 文件签名
signtool sign /f mycert.pfx /p password /t http://timestamp.digicert.com installer.msi
示例命令:对 CAB 文件签名
signtool sign /f mycert.pfx /p password /t http://timestamp.digicert.com package.cab

2.2.3 代码与脚本文件的签名支持

SignTool 还支持对脚本文件(如 .ps1 PowerShell 脚本)进行签名,以确保脚本的来源可信且未被篡改。

示例命令:对 PowerShell 脚本签名
signtool sign /f mycert.pfx /p password /t http://timestamp.digicert.com script.ps1
注意事项:
  • PowerShell 策略需设置为 RemoteSigned AllSigned ,否则签名脚本可能无法运行。
  • 设置执行策略命令如下:
Set-ExecutionPolicy RemoteSigned

支持签名文件格式对比表:

文件类型 是否支持签名 备注
EXE 常用于应用程序
DLL 动态链接库
SYS 驱动程序
MSI 安装包
CAB 压缩包
PS1 需设置执行策略
BAT 不支持签名
MSI 支持企业级部署

2.3 SignTool常用命令与参数说明

SignTool 提供了多个命令用于签名、验证和查询签名信息,其中最常用的三个命令是 sign verify info

2.3.1 基本签名命令sign

sign 命令用于对文件进行签名操作,是 SignTool 的核心功能之一。

示例命令:
signtool sign /f mycert.pfx /p password /t http://timestamp.digicert.com myapp.exe
参数说明:
参数 描述
/f 指定 PFX 格式的证书文件
/p 证书私钥的密码
/t 添加时间戳服务器地址
/v 显示详细输出信息(可选)
逻辑分析:
  • /f :指定签名证书来源,PFX 文件包含公钥和私钥。
  • /p :私钥加密保护,防止未经授权的签名操作。
  • /t :时间戳服务确保签名在证书过期后仍有效。
  • myapp.exe :目标文件,可以是 EXE、DLL、MSI、CAB 等格式。

2.3.2 签名验证命令verify

verify 命令用于验证文件的数字签名是否有效。

示例命令:
signtool verify /pa myapp.exe
参数说明:
参数 描述
/pa 使用默认策略验证所有签名
/v 显示详细输出信息
/q 静默模式,不输出信息
逻辑分析:
  • /pa :表示使用 Windows 默认的验证策略(PKI 验证链)。
  • myapp.exe :被验证的文件,验证其签名是否有效、证书是否吊销、是否过期等。

2.3.3 签名信息查询命令info

info 命令用于查看文件的签名信息,包括签名者、证书指纹、时间戳等。

示例命令:
signtool info myapp.exe
参数说明:
参数 描述
/v 显示详细签名信息
/s 显示所有签名(多签名文件)
输出示例:
File: myapp.exe
Index      Algorithm    Timestamp
0          SHA256       http://timestamp.digicert.com
Signer Serial Number: 1234567890ABCDEF
Signer Issuer: CN=DigiCert Inc, O=DigiCert Inc, C=US
逻辑分析:
  • 显示签名索引、使用的哈希算法、时间戳服务器地址。
  • 显示签名证书的序列号与颁发者信息,用于验证签名来源。

SignTool 常用命令对照表:

命令 用途 常用参数
sign 对文件进行签名 /f , /p , /t , /v
verify 验证签名有效性 /pa , /v , /q
info 查看签名信息 /v , /s
timestamp 添加时间戳 /t , /v

通过掌握 SignTool 的核心功能,开发者可以有效地保障软件的安全性与可信性。下一章将介绍如何在实际环境中使用 SignTool 进行文件签名操作,包括证书配置、签名流程和常见问题处理等内容。

3. 使用SignTool进行文件签名实战

在数字签名的实践过程中,SignTool 作为 Windows SDK 提供的重要工具,其核心作用在于对各类可执行文件进行签名和验证。本章将围绕 SignTool 的实战操作展开,详细介绍如何准备签名环境、对可执行文件进行签名、验证签名有效性,以及解决签名过程中可能遇到的常见问题。

3.1 准备签名环境与证书

数字签名的第一步是确保签名环境的正确配置,包括安装合适的代码签名证书以及配置证书存储区。只有在环境准备妥当的情况下,SignTool 才能正常识别并使用证书完成签名任务。

3.1.1 安装开发人员证书

代码签名证书通常以 PFX 文件格式提供,包含私钥和公钥。要将证书安装到本地计算机,可以使用 MMC(Microsoft Management Console)或使用命令行工具 certutil

使用 MMC 安装证书的步骤如下:

  1. 打开 运行 (Win + R),输入 mmc
  2. 在 MMC 控制台中,点击 文件 → 添加/删除管理单元
  3. 点击 添加 ,选择 证书 ,然后选择 计算机账户
  4. 完成添加后,右键点击 受信任的发布者 个人 存储区,选择 所有任务 → 导入
  5. 根据向导导入 PFX 文件,并输入私钥密码。

或者使用 certutil 命令行安装证书:

certutil -importPFX -user my certificate.pfx

参数说明:

  • -importPFX :指定导入 PFX 格式证书。
  • -user :指定证书存储在当前用户账户中。
  • my :表示证书将被导入到“个人”证书存储区。
  • certificate.pfx :证书文件名。

3.1.2 配置本地证书存储区

安装完成后,证书应被正确放置在“个人”证书存储区(Personal Store)。SignTool 默认会从该区域查找可用的签名证书。可以通过以下命令检查证书是否已正确安装:

certutil -user -store -v my

该命令将列出当前用户“个人”存储区中的所有证书,并显示证书的详细信息,包括颁发者、有效期、指纹等。

为了确保 SignTool 能识别证书,还需检查以下配置:

  • 私钥权限:确保当前用户对私钥有读取权限。可以使用 MMC 的证书管理界面,右键证书,选择 所有任务 → 管理私钥 ,添加当前用户或 SYSTEM 用户的读取权限。
  • 证书用途:证书必须具有“代码签名”用途,否则 SignTool 会拒绝使用该证书进行签名。

3.2 对可执行文件进行签名操作

当证书安装完毕并配置好签名环境后,即可使用 SignTool 对可执行文件(如 EXE、DLL、SYS)进行签名。

3.2.1 使用 SignTool 对 EXE 文件签名

SignTool 的基本签名命令如下:

signtool sign /fd SHA256 /a /tr http://timestamp.digicert.com /td SHA256 /v myapp.exe

参数说明:

  • sign :表示执行签名操作。
  • /fd SHA256 :指定文件摘要算法为 SHA-256。
  • /a :自动选择最佳签名证书。
  • /tr :指定时间戳服务器地址。
  • /td SHA256 :指定时间戳摘要算法为 SHA-256。
  • /v :启用详细输出,显示签名过程信息。
  • myapp.exe :待签名的可执行文件路径。

执行逻辑分析:

  1. SignTool 从“个人”证书存储区查找可用的代码签名证书。
  2. 使用 SHA-256 对文件内容进行哈希计算。
  3. 使用证书私钥对哈希值进行加密,生成数字签名。
  4. 将签名附加到文件的资源段中。
  5. 如果指定了时间戳服务器,SignTool 将向该服务器发送时间戳请求。
  6. 时间戳服务器返回带时间戳的签名数据,并附加到签名中。
  7. 最后输出签名结果和验证信息。

⚠️ 注意:若未指定时间戳服务器,签名将在证书过期后失效。建议始终添加时间戳。

3.2.2 签名后的文件属性验证

签名完成后,可以使用以下命令验证签名是否成功:

signtool verify /pa /v myapp.exe

参数说明:

  • verify :表示执行验证操作。
  • /pa :使用默认的验证策略(包括证书链验证、时间戳有效性等)。
  • /v :启用详细输出模式。

验证流程图如下:

graph TD
    A[开始验证] --> B{签名是否存在?}
    B -->|是| C[提取签名数据]
    C --> D[验证证书链]
    D --> E{证书是否有效?}
    E -->|是| F[验证时间戳有效性]
    F --> G{时间戳是否有效?}
    G -->|是| H[验证文件哈希是否一致]
    H --> I{哈希一致?}
    I -->|是| J[验证成功]
    I -->|否| K[验证失败]
    E -->|否| L[证书无效]
    G -->|否| M[时间戳无效]
    B -->|否| N[文件未签名]

如果验证结果为“Successfully verified”,则表示签名有效且文件未被篡改。

3.3 签名常见问题与解决方案

在实际操作中,可能会遇到签名失败、文件被拒绝签名等问题。以下是常见错误码及其解决方法。

3.3.1 签名失败的常见错误码分析

SignTool 在签名失败时会返回相应的错误码,以下是几个常见错误码及其含义:

错误码 描述 解决方案
0x80070005 拒绝访问私钥 检查私钥权限,确保当前用户有读取权限
0x80092004 没有可用的签名证书 检查证书是否安装正确,确保证书用途为“代码签名”
0x8009200B 证书链验证失败 检查证书是否由受信任的 CA 签发,确保证书未被吊销
0x8007007E 无法加载签名组件 重新安装 Windows SDK 或 .NET Framework
0x80092023 时间戳服务器连接失败 检查网络连接,更换时间戳服务器地址

例如,如果出现错误码 0x80070005 ,可以使用 MMC 管理控制台检查证书私钥权限:

  1. 打开 MMC,找到已安装的代码签名证书。
  2. 右键证书 → 所有任务 → 管理私钥
  3. 添加当前用户或 SYSTEM 用户的“读取”权限。

3.3.2 文件被拒绝签名的可能原因

除了错误码外,SignTool 还可能直接提示文件无法签名。以下是一些常见原因及处理方法:

  • 文件正在被占用 :确保目标文件未被其他程序打开或锁定。可以尝试重启资源管理器或关闭相关进程。
  • 文件格式不支持 :SignTool 支持签名的文件包括 PE 格式(EXE、DLL、SYS)、MSI、CAB 等。若尝试签名非 PE 格式文件(如 TXT、BAT),则会失败。
  • 签名已存在 :某些文件可能已经包含签名,SignTool 默认不会覆盖签名。可以添加 /as 参数追加签名:
    bash signtool sign /as /fd SHA256 /tr http://timestamp.digicert.com myapp.exe

  • 证书私钥保护策略限制 :部分证书可能启用了“私钥保护”功能,要求每次签名时手动确认。可以在证书管理界面取消“需要用户确认”选项。

  • 时间戳服务器不可达 :如果使用 /tr 指定时间戳服务器但连接失败,可尝试更换时间戳地址,例如:

bash signtool sign /tr http://timestamp.comodoca.com /td SHA256 myapp.exe

以下是一个签名失败的示例输出:

SignTool Error: The signer's certificate chain is not valid. (-2146885628/0x80092004)

该错误通常表示证书链验证失败,可能的原因包括:

  • 证书未被信任(未安装根证书或中间证书)。
  • 证书已吊销。
  • 证书用途不匹配。

解决方法:

  1. 打开 MMC,查看证书路径。
  2. 下载并安装缺失的根证书或中间证书。
  3. 使用 certutil -verify 检查证书链。
certutil -verify -urlfetch mycertificate.cer

该命令将验证证书链并尝试下载缺失的证书。

通过以上内容,我们系统地讲解了 SignTool 的签名实战流程,包括签名环境准备、签名操作执行、签名验证以及常见问题的诊断与处理。掌握这些内容后,开发者可以在实际开发与发布流程中高效、安全地应用数字签名技术。

4. 添加时间戳到数字签名操作

在数字签名领域,时间戳(Timestamping)是一项关键功能,它为签名行为提供了一个可信的时间记录。时间戳的加入不仅增强了数字签名的法律效力,还能有效解决证书过期后签名有效性的问题。本章将深入探讨时间戳服务的作用、如何在SignTool中配置时间戳服务器并执行签名操作,以及如何验证带有时间戳的签名信息。

4.1 时间戳服务的作用与必要性

4.1.1 时间戳对证书有效期的扩展作用

数字证书具有明确的有效期,通常为1到3年。一旦证书过期,使用该证书进行的签名将被视为不可信。然而,如果签名时加入了时间戳,则可以证明签名行为发生在证书有效期内。这使得即使证书已过期,签名依然有效。

核心机制:
时间戳服务器(TSA)提供一个可信的时间记录,并将其与签名数据绑定在一起。这个时间戳信息由TSA签名,确保其不可篡改。

时间戳作用 说明
延长签名有效期 签名时间在证书有效期内,则签名长期有效
提升法律效力 可作为电子证据的时间证明
支持审计与合规 为签名操作提供精确时间记录

4.1.2 防止签名过期后的无效问题

假设某开发者在2024年使用有效期至2026年的证书签署了一个程序。如果在2027年该证书已过期,但签名中包含了2024年的时间戳,则系统可以确认签名是在证书有效期内完成的,从而继续信任该签名。

示例场景流程图:

graph TD
    A[开发者使用有效证书签名] --> B{签名是否包含时间戳?}
    B -->|否| C[签名在证书过期后失效]
    B -->|是| D[时间戳验证签名时间在证书有效期内]
    D --> E[签名继续可信]

4.2 配置时间戳服务器与签名流程

4.2.1 使用RFC 3161兼容时间戳服务

时间戳服务遵循RFC 3161标准协议,该协议定义了客户端与时间戳服务器之间的通信方式。SignTool支持与RFC 3161兼容的时间戳服务器,例如:

  • DigiCert TSA :https://timestamp.digicert.com
  • Comodo TSA :http://timestamp.comodoca.com
  • GlobalSign TSA :http://timestamp.globalsign.com/scripts/timstamp.dll

配置说明:
在签名命令中通过 /t 参数指定时间戳服务器地址,SignTool会自动与该服务器通信,获取时间戳信息并将其嵌入签名中。

4.2.2 在SignTool中添加时间戳参数

SignTool支持在签名操作中通过命令行参数添加时间戳。以下是一个典型的签名命令示例:

signtool sign /f mycert.pfx /p password /t http://timestamp.digicert.com myapp.exe
参数说明:
参数 含义
/f mycert.pfx 指定签名证书文件路径
/p password 证书私钥的密码
/t http://timestamp.digicert.com 指定时间戳服务器地址
myapp.exe 要签名的文件
逐行代码逻辑分析:
  1. signtool sign :调用SignTool的签名功能;
  2. /f mycert.pfx :加载指定的PFX证书文件;
  3. /p password :提供证书私钥解密密码;
  4. /t http://timestamp.digicert.com :连接时间戳服务器并获取时间戳信息;
  5. myapp.exe :对指定的可执行文件进行签名并嵌入时间戳。

注意: 如果未指定 /t 参数,则签名将不包含时间戳信息,证书过期后签名可能被视为无效。

4.3 验证带时间戳的签名有效性

4.3.1 使用SignTool验证时间戳信息

SignTool提供了验证签名信息的功能,包括时间戳是否有效。以下命令可验证文件签名并显示时间戳详情:

signtool verify /v /pa myapp.exe
参数说明:
参数 含义
/v 详细输出模式
/pa 使用增强验证策略(Authenticode)
myapp.exe 要验证的文件
输出示例片段:
Signatures found: 1
Signature 0:
    ...
    TimeStamp: 2024-10-05 14:23:01
    TSA: http://timestamp.digicert.com
    Valid timestamp signature

4.3.2 检查签名时间与证书有效期匹配情况

验证签名时,系统会检查时间戳是否落在证书的有效期内。如果时间戳在证书有效期内,则签名视为可信;否则视为无效。

验证流程图:
graph TD
    A[验证签名] --> B{是否有时间戳?}
    B -->|否| C[仅检查证书是否有效]
    B -->|是| D[获取时间戳时间]
    D --> E{时间戳是否在证书有效期内?}
    E -->|是| F[签名有效]
    E -->|否| G[签名无效]
示例验证结果表格:
文件名 时间戳存在 时间戳时间 证书有效期 签名状态
app1.exe 2024-10-05 2024-01-01 ~ 2026-01-01 有效
app2.exe 2023-12-01 2024-01-01 ~ 2026-01-01 无效
app3.exe - 2024-01-01 ~ 2025-01-01(已过期) 无效

4.3.3 常见问题与处理建议

Q1:时间戳服务器连接失败?

可能原因:
- 网络不通或防火墙限制;
- 时间戳服务器地址错误;
- 时间戳服务器暂时不可用。

解决方法:
- 检查网络连接;
- 更换其他TSA服务器地址(如使用 https://timestamp.comodoca.com );
- 重试签名操作。

Q2:签名成功但时间戳无效?

可能原因:
- 时间戳服务器返回的时间与系统时间不一致;
- 时间戳签名被篡改或不完整。

解决方法:
- 校准系统时间;
- 重新签名并指定时间戳服务器;
- 使用其他验证工具检查时间戳签名。

4.3.4 时间戳与企业级签名策略

在企业环境中,签名流程通常需要集成时间戳以确保长期合规性。例如:

  • 持续集成(CI)流程中自动签名 :确保每次构建都带有时间戳;
  • 审计日志记录 :记录每次签名操作的时间与证书信息;
  • 证书生命周期管理 :在证书到期前更新并重新签名关键软件。

推荐做法:
企业应建立统一的时间戳服务地址标准,并在所有签名脚本中强制添加 /t 参数,以确保签名长期可信。

4.3.5 进阶探讨:时间戳与区块链结合的可行性

随着区块链技术的发展,一些组织开始探索将时间戳与区块链结合,以实现更高级别的可信时间记录。例如,将签名哈希值写入区块链,作为不可篡改的时间证据。

优势:
- 区块链提供分布式、不可篡改的时间记录;
- 增强签名的法律效力;
- 适用于金融、医疗等对时间要求极高的行业。

挑战:
- 实施成本高;
- 需要与现有签名流程整合;
- 技术标准尚未统一。

本章详细介绍了时间戳服务的重要性、在SignTool中配置时间戳服务器的方法、签名命令中时间戳参数的使用,以及如何验证带有时间戳的签名信息。通过合理使用时间戳,开发者可以确保其签名在证书过期后仍具备可信性,提升软件的合规性与用户信任度。

5. 证书的获取与导入配置方法

在数字签名过程中,证书是验证签名者身份的核心元素。本章将深入探讨代码签名证书的类型、申请流程、导入配置方式,以及在不同环境中如何安全地管理与迁移证书。通过本章内容,读者将掌握从证书获取到配置落地的全流程,适用于开发人员、企业IT管理员以及自动化部署团队。

5.1 证书类型与申请流程

在进行数字签名前,必须获取一个合法的代码签名证书。代码签名证书由可信的证书颁发机构(CA)签发,用于标识签名者的身份并确保签名数据的完整性。

5.1.1 个人开发者证书与企业证书

根据申请者的身份和用途,代码签名证书主要分为两类:

证书类型 适用对象 特点
个人开发者证书 个人开发者 成本较低,适用于签名个人发布的软件
企业级代码签名证书 企业组织 需要组织验证(OV),适用于企业级软件发布

个人开发者证书 适用于小型项目或独立开发者,通常由DigiCert、Sectigo、GlobalSign等CA机构提供。这类证书在申请时只需验证申请人的身份,流程相对简单。

企业级证书 则要求更高的验证等级,包括组织合法性、域名控制权、法人身份等多重验证。此类证书适合企业用于签署正式发布的商业软件。

5.1.2 向CA机构申请代码签名证书

申请代码签名证书的流程如下:

  1. 选择CA机构 :选择一个被操作系统和浏览器广泛信任的CA,如DigiCert、Sectigo、GoDaddy等。
  2. 提交申请信息
    - 个人证书:提供姓名、邮箱、身份证明(如护照或身份证)。
    - 企业证书:提供公司营业执照、税务登记、法人身份证明、域名所有权证明等。
  3. 生成密钥对 :在申请过程中,需生成一对非对称密钥(公钥和私钥)。通常使用工具如 certutil OpenSSL 生成CSR(证书签名请求)。
  4. 提交CSR :将生成的CSR文件提交给CA机构。
  5. 等待审核 :CA机构进行身份验证,通常需要1~3个工作日。
  6. 下载证书 :审核通过后,从CA网站下载PFX格式的证书文件(包含私钥)或CRT格式的公钥证书。
# 使用 OpenSSL 生成 CSR 和私钥
openssl req -new -newkey rsa:2048 -nodes -keyout mykey.key -out mycsr.csr

逐行解释:
- openssl req :调用 OpenSSL 的请求生成模块。
- -new :生成新的 CSR。
- -newkey rsa:2048 :生成一个新的 RSA 密钥对,长度为 2048 位。
- -nodes :不加密私钥。
- -keyout mykey.key :将私钥保存为 mykey.key 文件。
- -out mycsr.csr :将 CSR 保存为 mycsr.csr 文件。

5.2 证书的导入与存储管理

获得证书后,下一步是将其导入到操作系统或证书存储中,以便 SignTool 或其他签名工具能够访问和使用。

5.2.1 使用MMC控制台导入PFX证书

Windows 提供了 MMC(Microsoft Management Console)控制台来管理本地和用户的证书存储。

操作步骤:

  1. 打开 MMC 控制台:
    - 按下 Win + R ,输入 mmc 并回车。
  2. 添加证书管理插件:
    - 文件 → 添加/删除管理单元 → 选择“证书” → 添加 → 选择“计算机账户”或“我的用户账户” → 完成。
  3. 导入 PFX 证书:
    - 展开“证书”节点 → 右键“个人”或“受信任的发布者” → 所有任务 → 导入。
  4. 按照向导选择 PFX 文件,并设置私钥保护密码。
  5. 完成导入后,证书将出现在“个人”证书存储中。
graph TD
    A[打开 MMC 控制台] --> B[添加证书管理单元]
    B --> C[选择账户类型]
    C --> D[右键证书存储]
    D --> E[导入 PFX 文件]
    E --> F[完成证书导入]

5.2.2 设置证书私钥的访问权限

默认情况下,私钥文件的访问权限仅限于当前用户。在多用户或自动化环境下,需要调整私钥的访问权限以确保其他用户或服务可以使用。

操作步骤:

  1. 在 MMC 控制台中找到目标证书 → 右键 → 所有任务 → 管理私钥。
  2. 在弹出的权限窗口中,添加需要访问私钥的用户或服务账户(如 SYSTEM IIS_IUSRS )。
  3. 设置适当的权限(如读取)。
# 使用 PowerShell 查看证书私钥路径
$cert = Get-ChildItem -Path Cert:\LocalMachine\My\<证书指纹>
$cert.PrivateKey.CspKeyContainerInfo.UniqueKeyContainerName

逐行解释:
- Get-ChildItem -Path Cert:\LocalMachine\My\<证书指纹> :获取本地计算机“个人”存储中的指定证书。
- $cert.PrivateKey.CspKeyContainerInfo.UniqueKeyContainerName :显示私钥容器的唯一名称,可用于定位私钥文件位置。

5.3 证书的导出与迁移策略

在团队协作或跨机器部署中,证书的迁移和共享是常见需求。本节将介绍如何安全地导出包含私钥的证书,并在多台计算机间共享。

5.3.1 导出包含私钥的PFX文件

导出证书时,必须确保包含私钥,否则将无法用于签名。

操作步骤:

  1. 打开 MMC 控制台 → 找到要导出的证书。
  2. 右键证书 → 所有任务 → 导出。
  3. 选择“是,导出私钥” → 选择加密格式(推荐使用 AES-256)。
  4. 设置导出密码 → 选择保存路径 → 完成导出。
# 使用 PowerShell 导出 PFX 证书
$cert = Get-ChildItem -Path Cert:\LocalMachine\My\<证书指纹>
$pwd = ConvertTo-SecureString -String "your_password" -Force
Export-PfxCertificate -Cert $cert -FilePath "C:\certs\mycert.pfx" -Password $pwd

逐行解释:
- ConvertTo-SecureString :将明文密码转换为安全字符串。
- Export-PfxCertificate :导出证书并设置密码保护。

5.3.2 在多台计算机间共享证书

证书迁移需注意以下几点:

  • 安全性 :PFX 文件包含私钥,必须通过安全通道传输(如加密U盘、HTTPS、企业内部网络)。
  • 权限配置 :在目标机器上导入证书后,需重新配置私钥访问权限。
  • 时间戳一致性 :如果签名时使用了时间戳服务,确保证书在有效期内仍可验证。

典型场景:

  1. 开发与测试环境同步 :开发者在本机签名后,将证书导出并导入到测试服务器,以便进行签名验证。
  2. 自动化构建服务器 :CI/CD 环境中,将证书导入到构建服务器,使构建流程能自动签名输出文件。
  3. 团队协作 :多个开发人员共享同一证书以确保签名一致性。
graph LR
    A[证书导出] --> B[安全传输]
    B --> C[目标机器导入]
    C --> D[设置私钥权限]
    D --> E[签名使用]

表格:证书迁移注意事项

步骤 注意事项
导出 必须包含私钥,否则无法签名
传输 使用加密方式,防止私钥泄露
导入 在目标机器正确选择证书存储位置
权限 设置合适用户/服务账户的访问权限
验证 导入后使用 SignTool 验证证书可用性

通过本章内容,读者应已掌握如何获取代码签名证书、如何在 Windows 环境中导入与管理证书,以及如何安全地在不同设备间迁移证书。这些知识是构建完整数字签名流程的重要基础,也是保障软件签名安全性的关键环节。

6. 使用批处理脚本自动化签名流程

在软件开发和发布过程中,手动对每个可执行文件进行签名不仅效率低下,而且容易出错。为了提升签名流程的自动化程度,我们可以使用批处理脚本(Batch Script)与 SignTool 工具相结合,实现多文件批量签名、日志记录、错误处理以及与 CI/CD 构建系统的集成。通过本章的学习,读者将掌握如何构建一个稳定、高效的自动化签名流程。

6.1 编写自动化签名脚本的基础

在开始编写自动化签名脚本之前,我们需要理解批处理脚本的基本语法、SignTool 的调用方式以及如何将两者结合,实现参数化配置和日志记录功能。

6.1.1 批处理脚本与SignTool结合使用

Windows 批处理脚本(.bat 文件)是一种轻量级的脚本语言,适用于在命令行环境下执行一系列操作。SignTool 是 Windows SDK 提供的命令行工具,用于对文件进行签名、验证、查询等操作。我们可以将 SignTool 的命令嵌入到批处理脚本中,实现签名的自动化。

以下是一个简单的签名脚本示例:

@echo off
setlocal

:: 设置SignTool路径
set SIGNTOOL="C:\Program Files (x86)\Windows Kits\10\bin\x64\signtool.exe"

:: 设置证书路径
set CERT_PATH="C:\certs\mycert.pfx"

:: 设置证书密码
set CERT_PASSWORD=myPassword

:: 设置要签名的文件路径
set FILE_PATH="C:\build\myapp.exe"

:: 调用SignTool进行签名
%SIGNTOOL% sign /f %CERT_PATH% /p %CERT_PASSWORD% /t http://timestamp.digicert.com %FILE_PATH%

if %errorlevel% equ 0 (
    echo 文件签名成功
) else (
    echo 文件签名失败,错误代码:%errorlevel%
)

endlocal
逻辑分析与参数说明:
  • @echo off :关闭命令回显,使输出更干净。
  • setlocal :限制变量作用域,防止污染全局环境。
  • set SIGNTOOL="C:\Program Files (x86)\Windows Kits\10\bin\x64\signtool.exe" :设置 SignTool 的完整路径。
  • sign /f :指定用于签名的 PFX 证书文件。
  • /p :指定 PFX 文件的密码。
  • /t :添加时间戳服务器地址,以确保签名在证书过期后仍然有效。
  • if %errorlevel% equ 0 :检查命令执行后的返回值,0 表示成功。

6.1.2 脚本参数化设计与日志记录

为了增强脚本的灵活性和可维护性,我们可以将脚本参数化,允许用户通过命令行传入参数。同时,将签名操作记录到日志文件中,便于后续审计和排查问题。

@echo off
setlocal

:: 接收参数
set SIGNTOOL=%1
set CERT_PATH=%2
set CERT_PASSWORD=%3
set FILE_PATH=%4
set LOG_FILE=%5

:: 日志记录
echo [%date% %time%] 开始签名文件:%FILE_PATH% >> %LOG_FILE%

:: 执行签名
"%SIGNTOOL%" sign /f "%CERT_PATH%" /p "%CERT_PASSWORD%" /t http://timestamp.digicert.com "%FILE_PATH%"

if %errorlevel% equ 0 (
    echo [%date% %time%] 文件签名成功 >> %LOG_FILE%
) else (
    echo [%date% %time%] 文件签名失败,错误代码:%errorlevel% >> %LOG_FILE%
)

endlocal
调用示例:
sign_script.bat "C:\Program Files (x86)\Windows Kits\10\bin\x64\signtool.exe" "C:\certs\mycert.pfx" "myPassword" "C:\build\myapp.exe" "C:\logs\sign.log"
参数说明:
参数 含义
%1 SignTool 的路径
%2 证书文件路径
%3 证书密码
%4 待签名文件路径
%5 日志文件路径
流程图:
graph TD
    A[开始] --> B{接收参数}
    B --> C[设置日志记录]
    C --> D[调用SignTool签名]
    D --> E{签名是否成功?}
    E -->|是| F[记录成功日志]
    E -->|否| G[记录失败日志]
    F --> H[结束]
    G --> H

6.2 多文件批量签名与错误处理

在实际生产环境中,我们往往需要对多个文件进行签名,如多个 EXE、DLL 或 MSI 文件。此时,我们可以通过批处理脚本遍历文件夹,实现批量签名,并具备跳过已签名文件的能力。

6.2.1 遍历文件夹中的所有可执行文件

我们可以使用 for 命令遍历文件夹中的 .exe .dll 文件,并依次调用 SignTool 进行签名。

@echo off
setlocal

set SIGNTOOL="C:\Program Files (x86)\Windows Kits\10\bin\x64\signtool.exe"
set CERT_PATH="C:\certs\mycert.pfx"
set CERT_PASSWORD=myPassword
set FOLDER_PATH="C:\build"
set LOG_FILE="C:\logs\batch_sign.log"

echo [%date% %time%] 开始批量签名 >> %LOG_FILE%

for %%f in (%FOLDER_PATH%\*.exe %FOLDER_PATH%\*.dll) do (
    echo [%date% %time%] 正在签名文件: %%f >> %LOG_FILE%
    %SIGNTOOL% sign /f %CERT_PATH% /p %CERT_PASSWORD% /t http://timestamp.digicert.com "%%f"
    if %errorlevel% equ 0 (
        echo [%date% %time%] 文件签名成功: %%f >> %LOG_FILE%
    ) else (
        echo [%date% %time%] 文件签名失败: %%f,错误代码:%errorlevel% >> %LOG_FILE%
    )
)

echo [%date% %time%] 批量签名完成 >> %LOG_FILE%
endlocal
逻辑分析:
  • for %%f in (...) do (...) :循环遍历指定文件夹中的 .exe .dll 文件。
  • %%f 是当前遍历的文件路径。
  • 每次签名后检查 errorlevel ,记录成功或失败信息。

6.2.2 自动跳过已签名文件

为了避免重复签名,我们可以通过 signtool verify /pa 命令检查文件是否已签名,若已签名则跳过。

@echo off
setlocal

set SIGNTOOL="C:\Program Files (x86)\Windows Kits\10\bin\x64\signtool.exe"
set CERT_PATH="C:\certs\mycert.pfx"
set CERT_PASSWORD=myPassword
set FOLDER_PATH="C:\build"
set LOG_FILE="C:\logs\batch_sign_skip.log"

echo [%date% %time%] 开始批量签名(跳过已签名) >> %LOG_FILE%

for %%f in (%FOLDER_PATH%\*.exe %FOLDER_PATH%\*.dll) do (
    echo [%date% %time%] 检查文件是否已签名: %%f >> %LOG_FILE%
    %SIGNTOOL% verify /pa "%%f" >nul 2>&1
    if %errorlevel% equ 0 (
        echo [%date% %time%] 文件已签名,跳过: %%f >> %LOG_FILE%
    ) else (
        echo [%date% %time%] 文件未签名,开始签名: %%f >> %LOG_FILE%
        %SIGNTOOL% sign /f %CERT_PATH% /p %CERT_PASSWORD% /t http://timestamp.digicert.com "%%f"
        if %errorlevel% equ 0 (
            echo [%date% %time%] 文件签名成功: %%f >> %LOG_FILE%
        ) else (
            echo [%date% %time%] 文件签名失败: %%f,错误代码:%errorlevel% >> %LOG_FILE%
        )
    )
)

echo [%date% %time%] 批量签名完成 >> %LOG_FILE%
endlocal
参数说明:
  • verify /pa :验证文件是否已签名, /pa 表示使用自动检测签名策略。
  • >nul 2>&1 :将命令输出和错误信息重定向到空设备,避免控制台输出干扰。
表格:错误码含义对照表
错误码 含义
0 成功
1 文件未签名
其他 签名失败或发生异常

6.3 集成签名脚本到CI/CD构建流程

为了实现持续集成与持续交付(CI/CD),我们将自动化签名脚本集成到 Jenkins 或 Azure DevOps 等构建平台中,使得构建输出的二进制文件在构建完成后自动签名。

6.3.1 在Jenkins或Azure DevOps中调用签名脚本

在 Jenkins 中,我们可以通过 Execute Windows batch command 插件调用签名脚本;在 Azure DevOps 中,使用 Command Line 任务执行批处理文件。

Jenkins 配置示例:
pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                // 构建步骤
                bat 'msbuild myapp.sln'
            }
        }
        stage('Sign') {
            steps {
                bat 'call C:\\scripts\\sign_script.bat "C:\\Program Files (x86)\\Windows Kits\\10\\bin\\x64\\signtool.exe" "C:\\certs\\mycert.pfx" "myPassword" "C:\\build\\myapp.exe" "C:\\logs\\sign.log"'
            }
        }
    }
}
Azure DevOps 配置示例:
- task: CmdLine@2
  inputs:
    script: |
      call C:\scripts\sign_script.bat "C:\Program Files (x86)\Windows Kits\10\bin\x64\signtool.exe" "C:\certs\mycert.pfx" "myPassword" "$(Build.ArtifactStagingDirectory)\myapp.exe" "$(Build.ArtifactStagingDirectory)\sign.log"

6.3.2 自动签名与构建输出集成

在 CI/CD 中,签名脚本应与构建输出路径集成,确保每次构建生成的文件都能自动签名。通常做法如下:

  1. 构建输出路径设为统一目录(如 $(Build.ArtifactStagingDirectory) )。
  2. 签名脚本接收该路径作为参数,自动遍历并签名所有可执行文件。
  3. 使用构建系统提供的日志功能记录签名结果。
高级集成建议:
  • 将证书文件存储在安全的密钥管理服务中(如 Azure Key Vault)。
  • 使用环境变量传递证书密码,避免明文泄露。
  • 在签名失败时触发构建失败通知,确保问题及时修复。
示例:Azure DevOps 高级签名脚本调用
- task: CmdLine@2
  inputs:
    script: |
      call C:\scripts\batch_sign.bat ^
        "C:\Program Files (x86)\Windows Kits\10\bin\x64\signtool.exe" ^
        "C:\certs\mycert.pfx" ^
        "$(CERT_PASSWORD)" ^
        "$(Build.ArtifactStagingDirectory)" ^
        "$(Build.ArtifactStagingDirectory)\sign.log"

其中 $(CERT_PASSWORD) 是从 Azure DevOps 安全变量中传入的密码。

通过本章的学习,我们掌握了如何利用批处理脚本自动化执行 SignTool 签名流程,包括脚本参数化、日志记录、批量签名、跳过已签名文件以及与 CI/CD 构建流程的集成。这些技能将大大提升签名流程的效率和可靠性,为软件发布提供有力保障。

7. 软件发布中的数字签名应用

在软件开发与发布流程中,数字签名不仅是技术层面的安全保障,更是构建用户信任、提升软件可信度的重要手段。本章将从软件发布流程中的签名规范出发,探讨数字签名在用户信任建立中的关键作用,并进一步介绍企业级签名策略的制定与管理方法。

7.1 软件发布流程中的签名规范

7.1.1 发布前签名检查与流程标准化

在正式发布软件前,签名验证应作为标准流程中的必要环节。通常流程如下:

  1. 编译构建完成 :生成最终的可执行文件、DLL、安装包等。
  2. 签名前检查
    - 检查是否已配置有效的代码签名证书。
    - 确认SignTool路径与环境变量已正确配置。
    - 使用 signtool verify /pa 文件名 验证目标文件是否已签名。
  3. 签名操作
    bash signtool sign /f mycert.pfx /p 密码 /t http://timestamp.digicert.com 文件名.exe
    - /f :指定PFX证书文件路径。
    - /p :证书私钥密码。
    - /t :时间戳服务器地址。
  4. 签名后验证
    bash signtool verify /pa /v 文件名.exe
    - /v 参数输出详细验证信息,确保签名有效且时间戳正确。

7.1.2 数字签名作为发布质量控制点

在持续集成/持续交付(CI/CD)流程中,签名应作为质量控制的关键节点之一。例如,在 Jenkins 流水线中可以添加如下脚本:

stage('Sign Executable') {
    steps {
        bat 'signtool sign /f ${CERT_PATH} /p ${CERT_PASSWORD} /t http://timestamp.digicert.com myapp.exe'
    }
}
stage('Verify Signature') {
    steps {
        bat 'signtool verify /pa /v myapp.exe'
    }
}

该流程确保每一份发布版本都经过签名验证,避免未签名或签名失败的版本流入市场。

7.2 签名在用户信任建立中的作用

7.2.1 操作系统对未签名软件的警告机制

现代操作系统(如 Windows)对未签名或签名无效的软件会进行显著提示。例如:

  • Windows SmartScreen :会阻止未签名程序运行,并提示“此应用未被信任”。
  • Windows Defender :将未签名程序标记为潜在风险。
  • UAC(用户账户控制) :未签名的安装程序会显示更明显的警告提示。

这些机制显著影响用户的安装意愿。使用有效的数字签名可绕过这些警告,提升用户体验。

7.2.2 提升用户下载与安装意愿

数字签名的可视化效果也对用户行为产生积极影响。例如:

  • 属性窗口显示“发布者:MyCompany”
  • 安装时无安全警告,直接进入安装流程

这不仅提升了用户对软件的信任感,也有助于品牌建设。

7.3 企业级软件签名策略与管理

7.3.1 证书生命周期管理

企业级签名需对证书进行全生命周期管理,包括:

阶段 内容说明
申请 向可信CA机构申请代码签名证书(如DigiCert、Sectigo)
部署 导入PFX证书至本地或网络证书存储区
使用 在构建流程中自动调用SignTool进行签名
续订 证书到期前重新申请并部署新证书
撤销 证书遗失或私钥泄露时及时吊销
审计 定期检查签名记录与证书使用情况

可使用自动化工具如 Microsoft Certificate Lifecycle Manager(CLM)进行集中管理。

7.3.2 签名权限控制与审计追踪

企业环境中,签名操作应受到严格权限控制,确保仅授权人员可执行签名任务。常见策略包括:

  • 限制私钥访问权限 :通过证书管理器设置私钥仅特定用户或服务账户可访问。
  • 使用HSM(硬件安全模块) :将私钥存储在物理隔离的安全设备中,防止泄露。
  • 审计日志记录 :每次签名操作记录如下信息:
  • 签名时间
  • 签名人员或服务账户
  • 签名文件路径
  • 签名证书指纹

例如,使用 PowerShell 记录签名事件:

$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
$signer = $env:USERNAME
"[$timestamp] 用户 $signer 签署文件:myapp.exe" | Out-File -Append -FilePath "sign_log.txt"

通过上述策略,企业可实现签名操作的可追溯性与安全性。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:数字签名是保障数据完整性和来源真实性的重要技术,在软件发布、驱动安装和代码保护中具有关键作用。SignTool是微软提供的专业数字签名工具,支持签名、验证、时间戳和证书信息查看等功能。本文详细解析SignTool的使用流程与数字签名原理,并通过批处理脚本简化签名操作,帮助开发者掌握软件签名、驱动签名及代码签名的完整实践方法,提升软件发布的安全性和可信度。


本文还有配套的精品资源,点击获取
menu-r.4af5f7ec.gif

本文章已经生成可运行项目
签名工具 (SignTool.exe) 签名工具是一个命令行工具,用于对文件进行数字签名,验证文件或时间戳文件中的签名。 注意 Microsoft Windows NT、Windows Me、Windows 98 或 Windows 95 中不支持签名工具。 signtool [command] [options] [file_name | ...] 参数 参数 说明 command 命令标志之一,用于指定要对文件执行的操作。 options 用于修改命令标志的选项标志之一。 file_name 要进行签名的文件的路径。 签名工具支持下列命令。 命令 说明 catdb 在目录数据库中添加或移除目录文件。 sign 对文件进行数字签名。 signwizard 启动签名向导。只能为文件名命令行参数指定一个文件。 timestamp 时间戳文件。 verify 验证文件的数字签名。 下列选项应用于 catdb命令。 Catdb 选项 说明 /d 指定更新默认目录数据库。如果 /d和 /g 选项都未使用,则签名工具更新系统组件和驱动程序数据库。 /g GUID 指定更新由全局唯一标识符 (GUID) 标识的目录数据库。 /r 从目录数据库中移除指定的目录。如果未指定该选项,签名工具将向目录数据库添加指定的目录。 /u 指定为添加的目录文件自动生成唯一的名称。如有必要,将重命名目录文件,以避免现有的目录文件发生冲突。如果未指定该选项,签名工具将重写所添加的目录同名的任何现有目录。 注意 目录数据库用于自动查找目录文件。 下列选项适用于sign命令。 Sign 选项 说明 /a 自动选择最佳的签名证书。如果未指定该选项,签名工具仅查找一个有效的签名证书。 /c CertTemplateName 指定用于对证书进行签名的证书模板名(一个 Microsoft 扩展)。 /csp CSPName 指定包含私钥容器的加密服务提供程序 (CSP)。 /d Desc 指定已签名内容的说明。 /du URL 指定已签名内容的更详细说明的统一资源定位器 (URL)。 /f SignCertFile 指定文件中的签名证书。如果文件是个人信息交换 (PFX) 格式且受密码保护,则使用 /p 选项来指定密码。如果文件不包含私钥,则使用 /csp 和 /k 选项来分别指定 CSP 和私钥容器名。 /i IssuerName 指定签名证书的颁发者的名称。该值可以是整个颁发者名称的子字符串。 /k PrivKeyContainerName 指定私钥容器名。 /n SubjectName 指定签名证书的主体的名称。该值可以是整个主体名称的子字符串。 /p 密码 指定打开 PFX 文件时使用的密码。可以通过使用 /f 选项来指定 PFX 文件。 /r RootSubjectName 指定签名证书必须链接到的根证书的主体名称。该值可以是根证书的整个主题名称的子字符串。 /s StoreName 指定要在搜索证书时打开的存储区。如果未指定该选项,则打开“我的存储区”。 /sha1 哈希 指定签名证书的 SHA1 哈希。 /sm 指定使用一个计算机存储区,而不是使用用户存储区。 /t URL 指定时间戳服务器的 URL。如果该选项不存在,将不会对签名文件执行时间戳操作。如果时间戳操作失败,将生成一个警告。 /u 用法 指定签名证书中必须存在的增强型密钥用法 (EKU)。可以通过 OID 或字符串指定该用法的值。默认用法为“代码签名”(1.3.6.1.5.5.7.3.3)。 下列选项适用于 timestamp 命令。 Timestamp 选项 说明 /t URL 必选。指定时间戳服务器的 URL。要执行时间戳操作的文件必须在以前已经进行了签名。 下列选项适用于 verify 命令。 Sign 选项 说明 /a 指定可以使用所有方法来验证文件。首先,搜索目录数据库以确定是否在目录中对文件进行了签名。如果未在任何目录中对文件进行签名,签名工具将尝试验证文件的嵌入签名。验证可以或不能在目录中进行签名的文件时,建议使用该选项。可以或不能签名的文件示例包括 Windows 文件或驱动程序。 /ad 使用默认的目录数据库查找目录。 /as 使用系统组件(驱动程序)目录数据库查找目录。 /ag CatDBGUID 在由 GUID 标识的目录数据库中查找目录。 /c CatFile 通过名称指定目录文件。 /o Version 通过操作系统版本验证文件。version 参数的格式为 PlatformID:VerMajor.VerMinor.BuildNumber /pa 指定使用默认的身份验证策略。如果未指定 /pa 选项,签名工具将使用 Windows 驱动程序验证策略。此选项不能 catdb 选项一起使用。 /pg PolicyGUID 通过 GUID 指定验证策略。GUID 对应于验证策略的 ActionID。此选项不能 catdb 选项一起使用。 /r RootSubjectName 指定签名证书必须链接到的根证书的主体名称。该值可以是根证书的整个主题名称的子字符串。 /tw 指定如果签名没有时间戳,则生成一个警告。 下列选项适用于所有签名工具命令。 全局选项 说明 /q 执行成功时不生成输出,执行失败时生成最少的输出。 /v 执行成功、执行失败或产生警告消息时生成详细输出。 备注 签名工具要求本地计算机上安装了 CAPICOM 2.0 可再发行程序。可以从 http://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdkredist.htm 获得 CAPICOM 2.0 可再发行程序。 签名工具的 verify 命令确定签名证书是否由受信任的颁发机构颁发、是否已撤消了签名证书,以及签名证书对于特定策略是否有效(此项可选)。 执行成功时,签名工具返回退出代码 0;执行失败时,签名工具返回退出代码 1;执行完毕并给出警告时,签名证书返回退出代码 2。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值