从具有多个签名的签名可执行文件中读取证书数据

Sco*_*ott 4 sha1 sha256 authenticode cryptoapi digital-signature

微软正在远离SHA1.结果,许多可执行文件现在具有两个或更多个签名; 一个使用SHA1摘要以实现向后兼容,另一个使用SHA256.

例如,如果您查看vstest.executionengine.exeVisual Studio 2013的属性(查看Windows 8或Server 2012上的属性),您将看到它有来自3个不同证书的3个不同签名.

我已经有一个使用的组合代码CryptQueryObject,CryptMsgGetParam和.NET SignedCms,但它只能看到3个签名1.一个签名者似乎只有一条消息.

我需要获取所有签名的证书信息.如何对多个签名进行建模 - 是单个消息中的多个消息还是多个签名者?Microsoft是否添加了新的API或新标志来访问多个签名?

Sco*_*ott 6

事实证明,微软(有点)隐藏了后续的签名.添加其他签名时,整个CMS结构将添加为无符号属性.

因此,例如,解码为.NET SignedCms的双重签名的Authenticode签名将具有一个签名者,并且SignerInfo将具有UnsignedAttributes中的值.如果您获取属性ASN RawData值并将其传递给SignedCms.Decode,您将获得第二个签名.

// decode inner signature    
signedCms2.Decode(signedCms1.SignerInfos[0].UnsignedAttributes[0].Values[0].RawData);
Run Code Online (Sandbox Code Playgroud)

似乎不是向根签名签名者添加另一个属性,而是在最内层签名者属性中添加该属性.

另请注意,并非所有属性都是内部签名,我认为您需要检查属性上的正确Oid.

怀疑这是微软保持向后兼容性的最佳方式.

  • OID使用**1.3.6.1.4.1.311.2.4.1**(`szOID_NESTED_SIGNATURE`) (3认同)