代码签名证书 (Code Signing Certificate) 是提供给软件开发者, 对开发的二进制文件、VB脚本数字签名的数字证书。代码签名证书用于验证开发者身份真实性、保护代码的完整性。用户下载软件时, 能通过数字签名验证软件来源可信, 确认软件、代码没有被非法篡改。
代码签名证书分两种 OV 和 EV
EV 只有企业可以购买, 私钥在 USB key 里面, 可以签名驱动. Microsoft SmartScreen 直接信任
OV 个人可以申请. 私钥可以保存成文件, 不能签名驱动. Microsoft SmartScreen 通过累计下载数量受信任
Microsoft SmartScreen 和 杀毒软件毫无关系
证书就是身份识别用的, 各家杀毒软件有自己的数据库和病毒算法, 并不能变成免杀金牌.
现在流行的是在线安装. 在线安装的 exe hash 永远是不变的.
通过这个 exe 下载安装程序安装可以绕过浏览器和 Microsoft SmartScreen 的拦截
没有证书的软件是通过软件 hash 累计信用的, 缺点是更新软件后 hash 变化新软件要重新累计信用
有证书的软件, 信用是累计在证书上, 更新软件 hash 变动后任然可信.
比如用户装了360毒瘤, 360 就会在自己数据库里通过 hash 判断是否再白名单中 (保护费), 不在就报毒.
卡巴斯基这个做的比较好, 可以通过证书信誉决定是否报毒
用卡巴斯基来举例, 比如这两个都是没有签名的
ffmpeg.exe 没有签名使用人数很多达到了卡巴斯基的信任门槛就显示信任了.
JiJiDownForWPF.exe 没有签名发布时间很短没有人多少人使用就没有被杀毒软件信任
aria2c.exe 使用人数很少, 使用 upx 压缩签名后显示信任
没有做混淆加密这些的时候不签名也不报毒. 混淆拉满, 字符串加密, NecroBit, 防反汇编开启, 签名之后卡巴斯基信任了, 微软和360仍然报毒. 360更新软件之后就不报毒, 旧的360就报毒.
总之, 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
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
验证数字签名
你可以通过右键单击应用程序并单击属性来验证您的应用程序现在是否已签名。在数字签名选项卡 (如果存在) 上, 您可以查看签名证书和时间戳。