代码签名证书的使用

windows 安装包分发的坑

我们在开发完 windows 软件打包为 .exe 进行分发时,会遇到三个坑

1、用户通过浏览器下载 exe 安装包时会被拦截

2、点击 exe 文件安装时会被警告提醒或被杀毒软件误报为病毒

3、安装后点击运行电脑会报风险应用

代码签名证书的作用

使用代码签名证书(Code Signing Certificate)对 .exe 安装包进行签名,就是为了解决以上几个关键问题,提高软件的可信度、安全性和用户体验:


1. 防篡改验证

签名后的 .exe 文件如果被篡改(如恶意注入木马、病毒),签名就会失效,操作系统和安全软件会提示用户该文件可能不安全。

作用:确保下载和执行的安装包与开发者发布的一致,未被第三方修改。


2. 显示开发者身份

签名证书中包含了开发者或公司的合法身份信息(比如公司名称),安装时系统会显示:

发布者:XXX公司

而不是:

发布者:未知

作用:建立信任,减少用户在看到“未知发布者”时取消安装的情况。


3. 减少系统警告

未签名的 .exe 在 Windows 上运行时,特别是在 Windows 10/11 中,用户会看到如下警告:

Windows 保护你的电脑
SmartScreen 阻止了一个未识别的应用启动……

而签名文件可以显著减少这种阻拦提示,尤其是在配合EV代码签名证书时,可以直接绕过 SmartScreen 的拦截。


4. 提升安全软件兼容性

杀毒软件和防火墙会优先信任签名文件。未签名的程序更容易被拦截、隔离或误报为病毒。


5. 增强品牌信誉和用户信任

签名安装包表明你是一个有信誉的开发者或公司,用户在安装时更容易信任你的软件,有助于提升转化率和品牌形象。


6. 满足平台发布要求

一些平台(如 Microsoft、某些企业级分发平台)要求 .exe 必须签名才能被接受或正常安装。


总结:

问题/需求 是否可通过代码签名解决
防止文件被篡改 ✅ 是
显示合法发布者身份 ✅ 是
减少 Windows SmartScreen 拦截 ✅ 是(尤其是 EV 签名)
减少杀毒软件误报 ✅ 是
增强用户信任 ✅ 是
满足某些平台发布要求 ✅ 是

签名申请

建议申请 EV 证书,普通代码签名证书对 SmartScreen 的效果有限,新安装包可能仍提示不安全,需要累积信誉后才能被认为是安全的安装包。

若希望直接绕过 SmartScreen 拦截,建议使用EV 代码签名证书(Extended Validation Code Signing Certificate)。

签名申请平台:

安信证书

环度网信

TrustAsia

签名流程

购买 EV 代码签名证书后,给 .exe 安装包进行签名的流程大致如下。


1、准备

项目 说明
EV 代码签名证书 已购买的 EV 证书(如 Certum EV)
USB 令牌(Token) EV 证书强制使用硬件加密设备(证书私钥存于 USB 令牌中)
Microsoft SignTool 工具 Windows SDK 自带,也可单独下载
已编译的 .exe 文件 你要签名的安装包或应用程序可执行文件
时间戳服务器地址 用于防止签名因时间过期失效(Certum 常用时间戳地址见下)

2、安装签名工具 SignTool(推荐)

SignTool 是微软官方签名工具,免费、安全:

  • 安装 Windows 10 SDK
  • 安装完成后,signtool.exe 位于路径:
C:\Program Files (x86)\Windows Kits\10\bin\<version>\x64\

3、插入 USB Token 并导入证书(如果尚未完成)

  • 插入 EV 证书的 USB Token(比如 Certum 的 SafeNet eToken)
  • 安装配套驱动程序(通常证书提供商提供)
  • 证书将自动注册到 Windows 证书存储中,路径为:
证书管理器 > 个人 > 证书(可使用 certmgr.msc 打开)

4、签名命令(使用 SignTool)

这是标准签名命令(含时间戳):

signtool sign /tr http://timestamp.certum.pl /td sha256 /fd sha256 /n "你的公司名称" "your_app.exe"

参数说明:

  • /n "你的公司名称":签名证书中的发布者名称(如:ABC Technology Co., Ltd.)
  • /fd sha256:使用 SHA256 算法(现在已强制要求)
  • /td sha256:时间戳摘要算法(推荐 SHA256)
  • /tr http://timestamp.certum.pl:Certum 时间戳服务器(也可以用其他如 DigiCert 的:
  • your_app.exe:你的可执行文件路径

示例:

signtool sign /tr http://timestamp.certum.pl /td sha256 /fd sha256 /n "MySoftware Co., Ltd." myinstaller.exe

5、验证签名是否成功

运行以下命令来检查签名状态:

signtool verify /pa /v myinstaller.exe

或者右键 .exe → “属性” → “数字签名” 标签页 查看。


6、注意事项

项目 注意点
⚠️ Windows SmartScreen 仅 EV 证书才能立即信任,普通证书需要信誉积累
🔐 私钥安全 EV 证书私钥不可导出,只能通过 USB Token 使用
🔄 多次签名 若你对文件做了修改或重打包,需要重新签名
🕓 时间戳服务器 一定要加 /tr/td 否则签名会因过期而无效

使用批处理脚本自动签名

签名脚本内容(Windows 批处理文件)

将以下内容复制到一个 .bat 文件中,例如保存为 sign_myinstall.bat

@echo off
setlocal

:: 设置 SignTool 路径(请根据你安装的 SDK 版本修改)
set SIGNTOOL="C:\Program Files (x86)\Windows Kits\10\bin\x64\signtool.exe"

:: 要签名的文件
set TARGET_FILE=myinstall.exe

:: 发布者名称(填写你 EV 证书中的公司名称)
set PUBLISHER="你的公司名称或个人名称"

:: Certum 时间戳服务器
set TIMESTAMP=http://timestamp.certum.pl

echo 正在为 %TARGET_FILE% 进行数字签名...

%SIGNTOOL% sign /n %PUBLISHER% /tr %TIMESTAMP% /td sha256 /fd sha256 %TARGET_FILE%

if %errorlevel% neq 0 (
    echo 签名失败!请检查证书是否正确安装和 USB Token 是否插入。
) else (
    echo 签名成功!
)

pause
endlocal

使用说明:

  1. myinstall.exe 和这个 .bat 文件放在同一个目录下;
  2. 修改以下参数:
    • SIGNTOOL 路径(如需修改 SDK 版本);
    • PUBLISHER 为你的 EV 证书中的真实公司名称
  3. 双击运行这个 .bat 文件即可签名;
  4. 签名后可通过右键 → “属性” → “数字签名” 查看是否成功。

引用链接

[1] 安信证书: https://www.anxinssl.com/code-signing-certificate/
[2] 环度网信: https://www.ihuandu.com/codesigning.html
[3] TrustAsia: https://www.trustasia.com/ssl/trustasia/code-signing
[4] Windows 10 SDK: https://developer.microsoft.com/en-us/windows/downloads/sdk-archive/
[5] DigiCert 的:: http://timestamp.digicert.com