Подтвердить что ты не робот

Как проверить, имеет ли файл цифровую подпись

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

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

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

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

4b9b3361

Ответ 1

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

sigcheck.exe -a -u -e 

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

enter image description here

Пример unsigned dll

enter image description here

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

Ответ 2

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

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

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

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

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

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

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

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

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

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

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

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

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

Ответ 3

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

Ответ 4

Я нашел еще один вариант (чистый .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)");
            }
        }
    }
}

Ответ 5

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

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

npm install -g sign-check

sign-check 'path/to/file'

Ответ 6

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

свойство файла