快捷导航
本帖最后由 WS_Daniel 于 2019-3-15 14:25 编辑

微软是第一个宣布了SHA-1弃用计划,在2016年之后Windows和IE将不再信任SHA-1证书。正好我们公司的数字签名也到期了,索性就重新申请了sha256和sha1的新数字证书,用来给产品签名。
这时就要把用了多年的自动签名脚本改为支持sha256和sha1双证书的格式。公司原使用signcode.exe和SignTool.exe两种方式进行签名,其中signcode配合另外找的signcode-pwd.exe工具和pvk+spc文件可以不需要密码即可实现签名(不在此文中详诉),SignTool是直接用pfx证书+密码来进行签名。于是分别寻找两种方式:
查阅signcode的文档发现,signcode的命令行-a是用来指定数字签名的签名算法。试验了下,只支持sha1和md5,不支持sha256。所以此方法废弃。
再查阅SignTool文档,支持/fd来指定签名,试了md5、sha1、sha256均支持,所以直接在原来签名代码上添加个/sa /fd sha256后如下:
  1. SignTool.exe sign /v /as /ac /f
  2. D:\test\sign\sign_sha256\xxx.pfx /p xxxx /t http://timestamp.digicert.com
  3. /fd sha256 "D:\test_double_signed.exe"
复制代码

一开始出现/as选项不识别的问题,经研究是使用的SignTool版本为6.0,因为自己机器上装了win10的sdk,于是使用了最新的C:\Program Files (x86)\WindowsKits\10\bin\x86\signtool.exe。ps:貌似只有win10带的才支持/as选项,但nnd这货依赖的ncrypt.dll,bcrypt.dll等dll只在vista及以上系统有,所以还在用xp的同学就不要用了。如果想拷贝到其它系统上使用,同时拷贝同目录下的:
appxpackaging.dll
appxsip.dll
mssign32.dll
opcservices.dll
signtool.exe
signtool.exe.manifest
wintrust.dll
wintrust.dll.ini
Microsoft.Windows.Build.Appx.AppxPackaging.dll.manifest
Microsoft.Windows.Build.Appx.AppxSip.dll.manifest
Microsoft.Windows.Build.Appx.OpcServices.dll.manifest
Microsoft.Windows.Build.Signing.mssign32.dll.manifest
Microsoft.Windows.Build.Signing.wintrust.dll.manifest
再试验出现以下错误:
SignTool Error:The /t option isincompatible with the /as option.
SignTool Error: Specify the RFC 3161timestamp server's URL instead with /tr.

尝试把/t换成/tr,但是出现错误:
SignTool Error: The specified timestampserver either could not be reached orreturned an invalid response.
经过一番努力后,http://timestamp.digicert.com是较新的时间戳服务格式,兼容/t和/tr。最后将两个签名指令放到批处理文件里:

signtool sign /v  /f XXX_sha1.pfx /p 密码 /t http://timestamp.digicert.com test.exe

signtool sign /v /as /fd sha256 /f XXX_sha2.pfx /p 密码 /tr http://timestamp.digicert.com test.exe


举报 使用道具
| 回复

共 1 个关于使用signtool对代码进行sha1/sha2双签名的回复 最后回复于 2016-5-16 17:07

Sanji 沃通技术支持 注册会员 发表于 2016-5-16 17:07:07 | 显示全部楼层
LZ 强大。。。。。。。。。。。。。。。。。。。。
举报 使用道具
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

发新帖

版块推荐百宝箱

快速回复 返回顶部 返回列表