2009-03-20 2 views
23

Я хочу проверить программно, если файл был подписан цифровой подписью или нет.как проверить, есть ли у файла цифровая подпись

На данный момент, я нашел довольно туманно code in MSDN, что не компилируется ...

Любой идеи по этому вопросу?

Внешний инструмент с командной строкой также будет отличным, кстати.

+0

Не могли бы вы указать язык в вашем вопросе, или состояние, которое вы не возражаете. Это облегчит ответ. Благодарю. –

+0

Почему вы используете 2 аккаунта с именем Vinzz ??? –

+0

... и спрашивая точно такой же вопрос ??? –

ответ

9

Если вам нужен внешний инструмент, вы можете использовать signtool.exe. Это часть Windows SDK, она принимает аргументы командной строки, и вы можете узнать об этом подробнее, http://msdn.microsoft.com/en-us/library/aa387764.aspx

23

Скачайте Sigcheck y используйте следующую команду.

sigcheck.exe -a -u -e 

Пример подписанного DLL

enter image description here

Пример DLL беззнаковое

enter image description here

SigCheck это утилита командной строки, которая показывает версию файла номер. Good Luck

18

Важной недостающая часть ответа упоминая Signtool является:

Да, с хорошо известным signtool.exe вы также может узнать, если файл подписан. Не нужно загружать другой инструмент!

E.g. с простой линии:

signtool verify /pa myfile.exe 
if %ERRORLEVEL% GEQ 1 echo This file is not signed. 

(Для многословным из пут, добавить '/ V' после '/' ра.)

Можно спросить: почему это важно? Я просто подписываю файлы (снова), которые должны быть подписаны, и он работает.

Моя цель состоит в том, чтобы сохранить сборки чистыми и не подписывать файлы во второй раз, потому что не только дата изменяется, но и после нее двоичная.

Бизнес-пример: У моего клиента есть оптимизированный процесс создания и создания сообщений «dev ops». Существует множество источников для разных наборов файлов, и в конце все они строятся, протестированы и объединены в дистрибутив, и для этого необходимо подписать некоторые файлы. Чтобы гарантировать, что некоторые файлы не покидают устройство без подписания, мы подписали все важные файлы, даже если они уже были подписаны.

Но это не достаточно чистый:

1) Если мы подпишем еще раз файл, который уже подписан, дату файла и бинарные изменения отпечатков пальцев, а файл теряет сопоставимость с его источниками, если это просто скопировано. (По крайней мере, если вы подписываетесь с отметкой времени, которую мы всегда делаем, и я думаю, что это рекомендуется.)

Это серьезная потеря качества, потому что этот файл больше не сопоставим с его предшественниками из другого источника файла.

2) Если мы снова подпишем файл, это также может быть ошибкой, и это файл сторонних разработчиков, который не должен подписываться вашим устройством.

Вы можете избежать обоих, сделав условие подписания условным в зависимости от кода возврата предыдущего упомянутого вызова «signtool verify».

7

Я нашел еще один вариант (чистый код .Net) в Интернете here.

Код очень прост и работает.

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Security.Cryptography.X509Certificates; 
using System.Text; 
using System.Threading.Tasks; 

namespace ConsoleApplication1 
{ 
    internal class Program 
    { 
     private static void Main(string[] args) 
     { 
      string filePath = args[0]; 

      if (!File.Exists(filePath)) 
      { 
       Console.WriteLine("File not found"); 
       return; 
      } 

      X509Certificate2 theCertificate; 

      try 
      { 
       X509Certificate theSigner = X509Certificate.CreateFromSignedFile(filePath); 
       theCertificate = new X509Certificate2(theSigner); 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine("No digital signature found: " + ex.Message); 

       return; 
      } 

      bool chainIsValid = false; 

      /* 
    * 
    * This section will check that the certificate is from a trusted authority IE 
    * not self-signed. 
    * 
    */ 

      var theCertificateChain = new X509Chain(); 

      theCertificateChain.ChainPolicy.RevocationFlag = X509RevocationFlag.ExcludeRoot; 

      /* 
    * 
    * Using .Online here means that the validation WILL CALL OUT TO THE INTERNET 
    * to check the revocation status of the certificate. Change to .Offline if you 
    * don't want that to happen. 
    */ 

      theCertificateChain.ChainPolicy.RevocationMode = X509RevocationMode.Online; 

      theCertificateChain.ChainPolicy.UrlRetrievalTimeout = new TimeSpan(0, 1, 0); 

      theCertificateChain.ChainPolicy.VerificationFlags = X509VerificationFlags.NoFlag; 

      chainIsValid = theCertificateChain.Build(theCertificate); 

      if (chainIsValid) 
      { 
       Console.WriteLine("Publisher Information : " + theCertificate.SubjectName.Name); 
       Console.WriteLine("Valid From: " + theCertificate.GetEffectiveDateString()); 
       Console.WriteLine("Valid To: " + theCertificate.GetExpirationDateString()); 
       Console.WriteLine("Issued By: " + theCertificate.Issuer); 
      } 
      else 
      { 
       Console.WriteLine("Chain Not Valid (certificate is self-signed)"); 
      } 
     } 
    } 
} 
+1

Обратите внимание, что это извлекает сертификат, используемый для подписи файла, но НЕ проверяет, что подпись файла действительна (т. е. если вы нарушаете файл, этот метод все равно будет возвращать оригинал подписывающего лица, он не предупредит вас о том, что файл был изменен) –

-3

Выберите свойства <*>.exe rightclick>. если файл подписан, вы получите эту вкладку в окне свойств этого файла.

property of the file

+0

Я не вижу, как это помогает проверить «программно «если файл подписал цифровую подпись или нет :) –

+1

этот ответ действительно помог мне – JerryGoyal

+0

Вау, этот ответ ужасен. @JerryGoyal: наличие цифровой подписи ** не означает ничего. ** УБЕДИТЕСЬ, что это действительно, перейдя на цифровые подписи, выберите подпись, затем Детали и проверьте, что «Цифровая подпись в порядке» показана сверху. – ahmd0

1

Также вы можете попробовать использовать НПМ пакет sign-check на эти цели.

Это пакет реализует WinVerifyTrust API и имеет простое использование:

npm install -g sign-check 

sign-check 'path/to/file' 
Смежные вопросы