Как добавить метку времени при цифровой подписи файла в C#?

Я попытался реализовать в .NET C# утилиту, похожую на signtool.исполняемый. Для цифровой подписи файла я использовал классы 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 ответов


протокол метки времени Authenticode(tm) предшествует протоколу метки времени, определенному в RFC3161. Однако (и IIRC) нет прямой поддержки для запроса встроенной метки времени .Сеть.

Так можно:

  1. создайте клиент TSP, чтобы получить временные метки; или

  2. piggyback существующий свободный серверы меток времени, которые вокруг для подписания кода.

Хотя Я предложил бы #1 в большинстве случаев (это стандартное и более будущее доказательство) я не уверен, есть ли доступные библиотеки C#, которые поддерживают это сегодня.

Если вы заинтересованы в #2, то я знаю (потому что я написал ;-) что код внутри Mono (MIT.X11 лицензировано) для поддержки Authenticode(tm) и подписи кода (включая timestamping).