在C#中对文件进行数字签名时如何添加时间戳?

mir*_*cea 8 .net c# cryptography digital-signature

我尝试在.NET C#中实现类似于signtool.exe的实用程序.为了对文件进行数字签名,我使用了SignedCms和CmsSigner类.

CmsSigner signer;
...
SignedCms content = 
    new SignedCms(new ContentInfo(File.ReadAllBytes(aFileToSign)));
content.ComputeSignature(signer, true);
Run Code Online (Sandbox Code Playgroud)

但是,我不确定如何添加从时间服务器收到的时间戳.signtool.exe有选项

signtool sign /t "time server url" ...
Run Code Online (Sandbox Code Playgroud)

一种可能性似乎是使用Pkcs9SigningTime类,但我不知道如何正确使用它与时间戳服务器.所有示例都使用Pkcs9SigningTime和系统的当前时间.对于时间服务器,它可能更复杂,因为时间服务器有自己的证书,答案将包含时间和用作签名的哈希.

任何人都可以提供一些线索吗?

pou*_*pou 4

Authenticode(tm) 时间戳协议早于RFC3161中定义的时间戳协议。然而(和 IIRC)没有直接支持询问 .NET 中内置的时间戳。

所以你可以:

  1. 构建一个 TSP 客户端来获取您的时间戳;或者

  2. 搭载用于代码签名的现有免费时间戳服务器。

虽然在大多数情况下我会建议#1(这是一个标准且更具未来性),但我不确定目前是否有可用的 C# 库支持该方法。

如果您对 #2 感兴趣,那么我知道(因为我已经编写了它;-)该代码可在 Mono(MIT.X11 许可)内使用,以支持 Authenticode(tm) 和代码签名(包括时间戳)。