我尝试在.NET C#中实现类似于signtool.exe的实用程序。 为了对文件进行数字签名,我使用了SignedCms和CmsSigner类。
CmsSigner signer;
...
SignedCms content =
new SignedCms(new ContentInfo(File.ReadAllBytes(aFileToSign)));
content.ComputeSignature(signer, true);
但是,我不确定如何添加从时间服务器收到的时间戳。 signtool.exe具有选项
signtool sign /t "time server url" ...
一种可能性似乎在于使用Pkcs9SigningTime类,但我不知道如何正确使用它与时间戳服务器结合使用。所有示例都使用Pkcs9SigningTime和系统的当前时间。使用时间服务器,它可能会更复杂,因为时间服务器有自己的证书,答案将包含时间和用作签名的哈希。
任何人都可以提供一些线索吗?
答案 0 :(得分:4)
Authenticode(tm)时间戳协议早于RFC3161中定义的时间戳协议。但是(和IIRC)没有直接支持要求使用.NET构建的时间戳。
所以你可以:
构建TSP客户端以获取时间戳;或
搭载现有的免费时间戳服务器,用于代码签名。
虽然在大多数情况下我会建议#1(它是一个标准且更具前瞻性的证据)但我不确定今天是否有可用的C#库支持。
如果您对#2感兴趣,那么我知道(因为我已经写过;-),Mono(MIT.X11许可)中的code is available支持Authenticode(tm)和代码签名(包括时间戳)。