为什么需要对 EXE 文件进行代码签名

开发者必须采取适当措施,防止软件与应用程序包被恶意黑客篡改。一种有效方式便是使用代码签名证书对软件进行数字签名。代码签名既能保护开发者的声誉与可信度,也能提升整个软件生态的安全性。当合法的软件发布者或开发者未对软件进行数字签名时,终端用户在下载和安装过程中可能会收到警告,提示该软件可能来自不受信任的来源或存在潜在危害。

本文将介绍使用代码签名证书对 EXE 文件进行签名所需的全部步骤与前置条件。

签名 EXE 文件的前置条件

在开始签名之前,了解一些先决条件有助于确保流程顺畅。

获取代码签名证书

代码签名流程的第一步,是从受信任的证书颁发机构(CA)获取代码签名证书。Microsoft 关于代码签名证书的文档中列出了受信任 CA 的清单。通常可选择三类代码签名证书:

组织验证(OV)代码签名证书:此类证书在签发前需验证组织身份,CA 会对企业注册信息进行严格核查并确认组织合法性。OV 代码签名证书提供相当程度的安全保障,其声誉会随 Microsoft 声誉系统随时间逐步提升。常见的 OV 代码签名证书品牌包括 Comodo、Sectigo 与 DigiCert。

扩展验证(EV)代码签名证书:经 EV 代码签名证书签名的软件或应用程序包,因 CA 严格的审核流程,在 Windows 等操作系统中展现出更高等级的信任。任何已注册的实体、公司或组织均可申请。EV 证书签名的软件被安全警告标记的概率更低,用户体验更顺畅、用户信心更强。常见的 EV 代码签名证书品牌包括 DigiCert、Comodo 与 Sectigo。

个人代码签名证书:此类证书最适合构建小规模分发软件的个人或自由职业者。相比 OV 或 EV 证书,个人证书获取更便捷,便于快速对软件进行数字签名以避免 Windows 标记、保障流畅运行。从 CA 购买代码签名证书时,建议综合考虑 CA 声誉、价格与售后支持等因素。

鉴于近期行业标准与规范,所有代码签名证书均以 HSM(硬件安全模块)、YubiKey 等安全硬件令牌的形式存储并交付给软件发布者或开发者;部分 CA(如 DigiCert)也支持将证书托管于云端以实现远程代码签名。

硬件与软件要求

成功获取代码签名证书后,还需满足以下软硬条件才能完成 EXE 文件的数字签名:

安全硬件令牌:准备好 CA 在签发时寄送的 HSM / USB 设备,其中含有用于签名 EXE 文件的证书。硬件令牌应符合 FIPS 140-2 Level 2 或 Common Criteria EAL 4+ 等最低标准,以维护代码签名流程的完整性。

SignTool:SignTool 是 Microsoft 的命令行实用工具,可通过不同参数定制签名过程。默认情况下,SignTool 随 Windows SDK 一同打包,安装时只需勾选"Windows SDK Signing Tools for Desktop Apps"功能。安装后可在"C:\Program Files (x86)\Windows Kits\10\bin\10.0.26100.0\x86\signtool.exe"找到 SignTool。

网络连接:确保稳定的互联网连接,这在签名过程中验证证书与为签名加盖时间戳时至关重要。

配置安全硬件设备

若选择 HSM / USB 令牌,插入系统后通常还需按厂商说明完成首次配置,一般包括两步:安装认证软件(多数 HSM 或 USB 令牌需要 SafeNet Authentication Client 等认证软件与硬件令牌交互,需按 CA 指引下载安装);修改默认密码(硬件令牌通常带有 CA 设定的默认密码,务必修改为强密码)。

使用代码签名证书签名 EXE 文件的步骤

满足前置条件后,即可开始对 EXE 文件签名。

插入含代码签名证书的 HSM

将 CA 寄送的 HSM / USB 设备连接至 Windows 机器,若系统提示则安装相应设备驱动。

以管理员身份打开 CMD

SignTool 为命令行工具,需在命令提示符中运行。请以管理员身份打开命令提示符,以便无障碍访问系统工具与资源。

定位 SignTool 实用工具

如前所述,SignTool 属于 Windows SDK,通常位于 Windows Kits 文件夹:"C:\Program Files (x86)\Windows Kits\10\bin\10.0.26100.0\x86\signtool.exe"。

运行 SignTool 命令

使用如下命令对 EXE 文件进行签名:

signtool sign /tr http://CAtimestampserver.com /td SHA256 /fd SHA256 /v "path\to\yourfile.exe"

/tr:指定时间戳服务器 URL,SignTool 向该地址请求为签名加盖时间戳,确保证书未来过期后签名依然有效。

/td:设置时间戳的哈希摘要算法,此处为 SHA256。

/fd:设置文件的哈希摘要算法,此处同样为 SHA256。

/v:启用详细输出以显示更多信息。

请将"path\to\yourfile.exe"替换为您的 EXE 文件路径,并将"http://CAtimestampserver.com"替换为您所用 CA 的实际时间戳 URL(可在 CA 官网或手册中查询)。

输入密码(如需要)

执行命令后,可能提示输入认证接口工具的密码(即此前设定的密码)。若以 SafeNet 作为认证工具,则需输入对应的 SafeNet 密码。

验证签名过程

输入密码后签名开始,控制台应显示详细输出,表明文件已成功签名。

验证 EXE 是否已正确签名

按上述步骤成功签名后,务必验证签名是否正确应用且含时间戳。验证方式有多种:

检查文件属性:进入已签名 EXE 文件的存储路径,右键点击 EXE 文件选择"属性",切换到"数字签名"选项卡,若显示带时间戳的签名及"此数字签名正常"即表示成功。

使用 SignTool 验证:打开命令提示符,用 SignTool 本身验证刚签名的 EXE 文件:

signtool verify /pa /v "path\to\yourfile.exe"

在其他系统上测试:建议在多台设备上测试已签名文件。可将签名后的 EXE 上传至任意文件共享平台,在另一台系统下载并检查 Windows 是否弹出警告。若签名成功,Windows 应将该文件识别为来自受信任来源。

结语

代码签名是软件生态中的重要环节。通过代码签名证书对 EXE 文件进行数字签名,开发者与软件发布者可向终端用户证明其软件或应用程序包真实可信、未经恶意篡改。代码签名并非难事,遵循本分步指南,任何开发者都能轻松完成软件包的数字签名。