как проверить, имеет ли файл цифровую подпись - PullRequest
32 голосов
/ 20 марта 2009

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

На данный момент я обнаружил довольно туманный код в MSDN , который не компилируется ...

Есть идеи по этому поводу?

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

Ответы [ 6 ]

25 голосов
/ 18 марта 2014

Важная недостающая часть ответа с указанием signtool:

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

например. с простой линией:

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

(Для подробного вывода добавьте «/ v» после «/pa» .)

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

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

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

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

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

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

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

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

24 голосов
/ 18 июня 2013

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

sigcheck.exe -a -u -e 

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

enter image description here

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

enter image description here

Sigcheck - утилита командной строки, которая показывает номер версии файла. Удачи

12 голосов
/ 20 марта 2009

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

9 голосов
/ 10 декабря 2015

Я нашел другой вариант (чистый .Net код) в Интернете здесь .

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

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)");
            }
        }
    }
}
2 голосов
/ 19 августа 2017

Также вы можете попробовать использовать пакет npm sign-check для этих целей.

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

npm install -g sign-check

sign-check 'path/to/file'
0 голосов
/ 07 марта 2017

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

property of the file

...