代码签名证书 | SignTool 使用帮助

标签: none

代码签名证书 (Code Signing Certificate) 是提供给软件开发者, 对开发的二进制文件、VB脚本数字签名的数字证书。代码签名证书用于验证开发者身份真实性、保护代码的完整性。用户下载软件时, 能通过数字签名验证软件来源可信, 确认软件、代码没有被非法篡改。

代码签名证书分两种 OV 和 EV
EV 只有企业可以购买, 私钥在 USB key 里面, 可以签名驱动. Microsoft SmartScreen 直接信任
OV 个人可以申请. 私钥可以保存成文件, 不能签名驱动. Microsoft SmartScreen 通过累计下载数量受信任

Microsoft SmartScreen 和 杀毒软件毫无关系
Microsoft SmartScreen.png

证书就是身份识别用的, 各家杀毒软件有自己的数据库和病毒算法, 并不能变成免杀金牌.
现在流行的是在线安装. 在线安装的 exe hash 永远是不变的.
通过这个 exe 下载安装程序安装可以绕过浏览器和 Microsoft SmartScreen 的拦截

没有证书的软件是通过软件 hash 累计信用的, 缺点是更新软件后 hash 变化新软件要重新累计信用
有证书的软件, 信用是累计在证书上, 更新软件 hash 变动后任然可信.

比如用户装了360毒瘤, 360 就会在自己数据库里通过 hash 判断是否再白名单中 (保护费), 不在就报毒.
卡巴斯基这个做的比较好, 可以通过证书信誉决定是否报毒

卡巴斯基来举例, 比如这两个都是没有签名的

ffmpeg.exe 没有签名使用人数很多达到了卡巴斯基的信任门槛就显示信任了.

ffmpeg_reputation.png

JiJiDownForWPF.exe 没有签名发布时间很短没有人多少人使用就没有被杀毒软件信任

JiJiDownForWPF_reputation.png

aria2c.exe 使用人数很少, 使用 upx 压缩签名后显示信任

aria2_reputation.png

没有做混淆加密这些的时候不签名也不报毒. 混淆拉满, 字符串加密, NecroBit, 防反汇编开启, 签名之后卡巴斯基信任了, 微软和360仍然报毒. 360更新软件之后就不报毒, 旧的360就报毒.

N2NGUILauncher_reputation.png
N2NGUILauncher_report.png

总之, OV 签名不是直接无视杀毒的要看各家杀毒的数据库, 好处是证书一但被杀毒软件信任后续更新软件就不会报毒了.

购买

Comodo Code Signing Certificates 这家的代码签名目前是最便宜的, 证书链是 Sectigo 这个是 Comodo CA 的新名称

Sectigo (AAA)
└──Sectigo Public Code Signing Root R46
   └──Sectigo Public Code Signing CA R36
      └── 证书名字

手动生成 ECC 的代码签名 CSR 文件

使用 OPENSSL 手动生成 CSR 文件 | MANUALLY GENERATE CSR

签名

使用 sha1 签名 (已经被淘汰, 如果需要支持win 7 以下的程序需要sha1 签名)

"C:\Program Files (x86)\Microsoft SDKs\ClickOnce\SignTool\signtool.exe" sign /t http://timestamp.comodoca.com/authenticode file.exe

使用 sha256 签名 (2022 年一般使用这个签名)

"C:\Program Files (x86)\Microsoft SDKs\ClickOnce\SignTool\signtool.exe" sign /tr http://timestamp.sectigo.com?td=sha256 /td sha256 /fd sha256 /as file.exe

使用 sha384 签名

"C:\Program Files (x86)\Microsoft SDKs\ClickOnce\SignTool\signtool.exe" sign /tr http://timestamp.sectigo.com?td=sha384 /td sha384 /fd sha384 /as file.exe

Authenticode Code Signing with Microsoft SignTool

SignTool 微软文档

SHA1 和 SHA2 双签名

只需要先执行 sha1 的签名再执行 sha2 的签名, 就实现双重签名了

signtool failing to dual sign SHA2 and SHA1 with timestamps

时间戳服务器 (time-stamping server)

签名中会使用到这个时间戳服务器, 即使证书过期了. 在有效期内签名过的程序仍然可以正常使用

这个服务器地址不用和颁发证书的机构对应

http://timestamp.globalsign.com/scripts/timstamp.dll  # 不稳定
http://timestamp.comodoca.com/authenticode
http://timestamp.sectigo.com
http://timestamp.sectigo.com?td=sha256
http://timestamp.sectigo.com?td=sha384
http://www.startssl.com/timestamp
http://timestamp.digicert.com?alg=sha1
http://timestamp.digicert.com?alg=sha256

Time Stamp Server & Stamping Protocols for Digital Signatures/Code Signing

RFC3161 compliant Time Stamp Authority (TSA) server

Alternative timestamping services for Authenticode

验证数字签名

你可以通过右键单击应用程序并单击属性来验证您的应用程序现在是否已签名。在数字签名选项卡 (如果存在) 上, 您可以查看签名证书和时间戳。

aria2_verify_signature.png


扫描二维码,在手机上阅读!

添加新评论