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

时间:2011-10-11 12:56:04

标签: c# .net cryptography digital-signature

我尝试在.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和系统的当前时间。使用时间服务器,它可能会更复杂,因为时间服务器有自己的证书,答案将包含时间和用作签名的哈希。

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

1 个答案:

答案 0 :(得分:4)

Authenticode(tm)时间戳协议早于RFC3161中定义的时间戳协议。但是(和IIRC)没有直接支持要求使用.NET构建的时间戳。

所以你可以:

  1. 构建TSP客户端以获取时间戳;或

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

  3. 虽然在大多数情况下我会建议#1(它是一个标准且更具前瞻性的证据)但我不确定今天是否有可用的C#库支持。

    如果您对#2感兴趣,那么我知道(因为我已经写过;-),Mono(MIT.X11许可)中的code is available支持Authenticode(tm)和代码签名(包括时间戳)。