如何给exe签名才能顺利交付并找准报错原因
给exe签名,可以按四步完成:准备可用的代码签名证书,接通对应私钥,签署最终程序文件,再检查签名和时间戳。Windows应用常用的工具是Windows SDK里的SignTool。证书买好以后不会自动给程序加签名,还需要在发布前完成这四步。
如果已经遇到报错,先看出错位置。“找不到证书”先查证书选择,“无法访问私钥”先查设备或账户授权,“时间戳失败”先查服务连接。签名完成却验证失败,再检查文件是否被修改。不要一上来就卸载全部工具,也不要用关闭系统验证的办法掩盖问题。

先把准备发布的文件固定下来
把已经完成编译、图标修改和资源处理的exe放进单独目录,后面就对这份文件签名。签完以后再修改受保护的内容,会破坏原有签名,需要重新处理。
软件如果包含主程序和安装程序,应先处理内部需要独立签署的程序,再打包,最后签安装包。安装包的签名不会自动成为内部exe的独立签名。用户会单独启动的更新器、辅助工具,也应纳入发布检查。
正式上传时,直接使用已经签署并验证的成品。不要又从编译目录拿出一份同名文件,否则很容易出现技术人员签过名、客户收到的却没签的情况。
让签名工具能用到私钥
使用Ukey,先安装设备配套驱动和管理工具,插入令牌,检查管理界面能否看到证书。核对公司名称和有效期,再确认PIN可以正常完成授权。
使用云签名,先完成账户激活和身份验证,安装服务提供的客户端或连接组件。登录成功以后,还要确认实际签名工具能够调用云端密钥。网页能登录,并不代表命令行已经连通。
两种方式都不要求把硬件或云端私钥导出成PFX。网上的PFX教程只适用于能合法使用相应私钥文件的场景,不能硬套到所有商业代码签名产品上。
首次测试请使用以后负责发版的同一个Windows账号。个人账号能签,构建服务账号却不能签,往往是证书存储位置、密钥权限或授权方式不同。
本地令牌接通后怎样用SignTool签名
先安装Windows SDK中的签名工具。下面的例子适用于令牌驱动已经把证书和私钥接口提供给Windows、当前账号能够调用私钥,而且可选的有效代码签名证书只有目标这一张的环境。
在MyApp.exe所在目录运行:
signtool sign /a /fd SHA256 /tr http://timestamp.digicert.com /td SHA256 MyApp.exe
MyApp.exe换成实际文件名。/a自动选择证书,/fd SHA256指定文件摘要,/tr与/td SHA256用于RFC 3161时间戳。时间戳地址采用微软SignTool文档中的服务示例;正式部署也可使用证书交付说明指定的时间戳服务。
如果电脑上有多张可用证书,先明确目标证书,再配置选择条件,不要依赖自动选择。SignTool里的/sha1用于指定证书指纹,不表示给文件使用SHA-1摘要,文件摘要仍由/fd控制。
云签名是否能直接使用这条命令,要看服务是否向SignTool提供密钥接口。没有接入时,应在云签名客户端中完成文件签署,不能只改证书名称就照搬命令。
签名后用这条命令检查
signtool verify /pa /v /tw MyApp.exe
这条命令验证普通Windows应用签名,显示详细信息,并在缺少时间戳时告警。检查发布者是不是本公司、签名是否通过、时间戳是否存在且有效。它不用于代替内核驱动的专门验证。
SignTool返回0表示成功,1表示失败,2表示有警告。发布脚本不能把“命令运行完了”当作验证通过。遇到警告,先看具体内容,特别要防止没有时间戳的安装包直接进入下载渠道。
最后在目标Windows系统安装一次。如果软件支持自动更新,再做一次从旧版本升级的测试。这样才能确认交给用户的是正确文件,升级器也没有因为证书变更出现额外限制。
找不到证书时先查这三处
先查运行账号。签名窗口、计划任务和构建服务是否由同一账号运行?当前用户证书与本机证书不是同一个位置,不要只在自己的桌面里看到证书,就断定后台任务也能看到。
再查选择条件。证书是否过期,名称或指纹是否写错,续期后是否还指向旧证书?如果刚换证书就报错,优先检查脚本里保留的旧指纹。
最后查设备或客户端。Ukey能否被管理工具识别,云签名客户端是否已登录并完成授权?只有公开证书而没有可调用的私钥,也不能完成签名。
如果提示PIN异常,不要连续猜密码,先按设备的解锁方式处理。如果后台任务没有地方弹出授权窗口,就要采用服务支持的集成方式,不能靠把PIN和密码写进公开脚本解决。
时间戳失败就查连接和参数
文件签名成功、时间戳失败,是可以分别发生的。先检查日志中的时间戳报错,再核对服务地址、协议和摘要设置。公司代理、防火墙或网络出口限制,也可能导致本地签名正常但时间戳请求失败。
先修复连接或参数,再重新加时间戳并验证文件。不要只看到一行签名成功就上传。可信时间戳关系到证书自然到期后的历史签名验证,文件的创建日期不能代替它。
如果服务暂时不可用,就暂停这次发布,恢复后重试。切换时间戳服务要使用可信且工具支持的服务,不要随便找一个地址凑数。
签过名仍然有弹窗,要看是哪种提示
签名验证失败,先确认上传前后是不是同一文件,再查是否有重新打包、改资源等操作。签名后增加了一道加工步骤,是应当优先排查的地方。
签名正常但仍有SmartScreen提醒,就不要继续把问题当成签名损坏。SmartScreen还判断应用信誉,EV代码签名证书也不能保证立即免除所有提示。按具体提醒检查分发来源、软件行为和信誉情况。
杀毒软件报毒则另行分析。先排查程序本身,确认为误报后通过检测厂商渠道申诉。给同一个文件重新签几遍,不会替代恶意软件检测,也不是处理误报的办法。
第一次采购可以从这两款里选
准备为exe搭建本地签名环境,可以选GlobalSign EV代码签名证书。安信SSL证书这款产品年费4000元,包含Ukey并支持国内顺丰邮寄。将令牌交给发版人员保管,在固定电脑上配置驱动和SignTool,后续照着已经测试通过的方法操作即可。
不想保管实体令牌,推荐安信SSL证书的Certum EV代码签名证书,2500元/年,采用云签名,无需本地Ukey。它省去了设备邮寄和交接,适合希望减少USB设备管理的团队,使用时要保证网络和账户授权正常。
两款都是企业EV产品,均需完成企业身份审核。选择时直接告诉我们签什么文件、用哪种系统、人工操作还是构建服务器调用,就能把证书选型和安装方法一起定下来。已有发布工作站,优先沿用熟悉的本地方案;设备经常需要跨地交接,则优先考虑云签名。
代码签名证书常见问题
1、给exe证书签名一定要买EV代码签名证书吗?
不一定。普通应用要选择适合申请主体与发布要求的代码签名产品,不是所有exe都强制要求EV。客户验收或特定平台另有要求时,再按明确要求选购。
2、安装了Windows SDK为什么还找不到SignTool?
先确认安装了SDK里的签名工具组件,再查SDK安装目录下的bin文件夹。工具路径未加入环境变量时,可以用完整路径运行,或在工具所在目录启动命令窗口。
3、签名后改了图标,需要重新签吗?
需要重新检查并签署最终文件。图标属于程序资源,修改会影响受保护内容。把资源调整放到签名前,能避免反复重签。
4、换了签名电脑,证书还能用吗?
可以重新配置使用环境。Ukey方案在新电脑安装驱动后连接设备;云签名方案重新配置客户端和授权。不要把迁移电脑理解为导出受保护私钥。
5、只把公开证书文件发给同事,他能帮我签名吗?
不能。签名需要调用对应私钥。协作应通过企业授权的设备或服务完成,公开证书只用于身份和签名验证,不能代替私钥。
