Как добавить метку времени при цифровой подписи файла в C #? - PullRequest
8 голосов
/ 11 октября 2011

Я пытался реализовать в .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 Ответ

4 голосов
/ 13 октября 2011

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

Так что вы можете:

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

  2. добавление существующих свободных серверов отметок времени, которые используются для подписи кода.

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

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

...