如果是开发者,必须购买新证书并重新签名发布新版本;如果是普通用户,最直接的办法是联系开发者获取已更新签名的安装包,不要强行绕过安全警告。
先说结论:证书过期属于不可逆的信任失效,客户端无法修复,必须由开发者更新签名后重新分发。
- 先确认:使用签名查看工具确认是证书过期还是时间戳缺失。
- 先处理:开发者需续期证书并在构建时配置 RFC3161 时间戳服务器。
- 再验证:在干净系统中测试安装,确保 SmartScreen 不再拦截。
环境准备:如何获取 signtool
Windows 系统默认不包含 signtool 命令。你需要通过以下方式之一获取:
- 方案 A(推荐):安装 Visual Studio 后,在开始菜单搜索并打开“Developer Command Prompt for VS 2022”(或对应版本)。
- 方案 B:安装 Windows SDK,在安装选项中勾选“Windows 签名工具”,之后可在 SDK 安装目录下的
bin文件夹找到signtool.exe。
打开命令提示符后,输入 signtool 回车,若有帮助信息输出则说明环境就绪。
如何确认签名状态
在开发者命令提示符中,切换到安装包所在目录,执行以下命令:
signtool verify /pa /v 你的安装包.exe
重点关注输出结果:
- 若显示 “时间戳” 相关错误,说明签名时未嵌入时间戳。
- 若显示 “证书有效期已过” 且无时间戳保护,说明签名已失效。
- 若显示 “Number of signatures successfully verified: 1”,则签名状态正常。
问题根源:时间戳缺失
Windows 对可执行文件的信任基于代码签名证书。证书都有有效期,通常为 1 到 3 年。关键在于“时间戳”:如果签名时加入了可信时间戳,即使证书后来过期,签名依然被视为有效,因为能证明签名时证书是好的。如果没有时间戳,证书一过期,Windows 就会认为签名不可信,导致安装被拦截或报未知发布者。
开发者解决方案:更新配置
1. 更新证书
登录证书颁发机构控制台续期或购买新证书。如果是 EV 证书,确保签名机器已插入 USB 令牌。
2. 配置 electron-builder
在项目的 package.json 文件的 build 字段中,或独立的 electron-builder.yml 配置文件中,确保证书路径正确,并强制开启时间戳。以下是 package.json 配置示例:
{"name": "your-app","version": "1.0.0","build": {"win": {"sign": true,"certificateSubjectName": "你的公司名","rfc3161TimestampServer": "http://timestamp.digicert.com"}}
}3. 重新构建与发布
使用新证书构建新版本,版本号建议递增,通过自动更新机制推送给用户。构建时请留意日志,确保没有 timestamp 相关的报错。
用户临时应对方案
警告:以下操作会降低系统安全性,仅在确认文件来源绝对安全(如官方渠道下载)且急需使用时尝试。
如果安装被 Windows SmartScreen 拦截:
- 在安装向导弹窗中点击“更多信息”。
- 点击出现的“仍要运行”按钮。
这不会解决根本问题,下次更新还会报错。根本解决需联系开发者更新签名。
验证签名是否生效
构建完成后,可通过以下方式验证:
- 图形界面:右键安装包属性,查看“数字签名”标签页。点击“详细信息”,确保证书状态显示“这个数字签名正常”,且时间戳存在。
- 命令行:再次使用
signtool verify /pa /v 你的安装包.exe确认无错误。 - 实机测试:最好在未安装过该软件的虚拟机或干净系统中测试,观察是否弹出 SmartScreen 蓝色拦截界面。
常见坑与排查
1. 时间戳服务器不可用:构建时会报错,导致签名失败,不要忽略构建日志中的 timestamp 错误。可尝试更换时间戳服务器地址。
2. EV 证书需要硬件令牌:如果是 EV 证书,签名机器必须插入 USB 令牌,CI/CD 流水线需特殊配置(如使用云签名服务)。
3. 信誉重置:更换新证书后,SmartScreen 信誉积累会清零,初期用户仍可能看到警告,这是正常现象,需随使用时间逐渐恢复。
参考来源
Microsoft Learn - About Timestamping (https://learn.microsoft.com/en-us/windows/win32/seccrypto/about-timestamping)
electron.build - Windows Specific Configuration (https://www.electron.build/configuration/configuration#windows-specific-configuration)
原文链接:https://www.zjcp.cc/ask/11114.html
