38

ファイルがデジタル署名されているかどうかをプログラムで確認したいと思います。

しばらくの間、私はコンパイルされないかなりあいまいなMicrosoft コードを見つけました...

この件について何か考えはありますか?

ちなみに、コマンドラインを備えた外部ツールも素晴らしいでしょう。

4

7 に答える 7

31

言及されている回答の重要な欠落部分は次のsigntoolとおりです。

はい、既知signtool.exeのファイルを使用すると、ファイルが署名されているかどうかを確認することもできます。別のツールをダウンロードする必要はありません。

たとえば、次の単純な行を使用します。

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

(詳細な出力の場合は、/vafterを追加し/paます。)

なぜこれが重要なのですか?署名されるファイルに(再度)署名するだけで機能します。

私の目的は、ビルドをクリーンに保ち、日付が変更されるだけでなく、その後バイナリが異なるため、ファイルに再度署名しないことです。

ビジネス例: 私のクライアントは、合理化された自動化された「dev ops」の種類のビルドおよびビルド後のプロセスを持っています。さまざまなファイル セットには複数のソースがあり、最終的にすべてがビルド、テストされ、配布にバンドルされます。そのために、いくつかのファイルに署名する必要があります。一部のファイルが署名されずにユニットから出ないようにするために、メディア上にある重要なファイルはすべて、署名済みであっても署名していました。

しかし、これは十分にきれいではありませんでした! 一般的:

  1. すでに署名されているファイルに再度署名すると、ファイルの日付とバイナリ フィンガープリントが変更され、単純にコピーされた場合、ファイルはソースとの比較可能性を失います。(少なくとも、タイムスタンプを使用して署名する場合は、これを常に行っており、強くお勧めします。)

ファイル自体は変更されていませんが、このファイルは以前のファイルと同一ではないため、これは重大な品質の低下です。

  1. ファイルに再度署名すると、それが当社によって署名されるべきではないサードパーティのファイルである場合、これも障害になる可能性があります。

signtool verify上記の呼び出しの戻りコードに応じて、署名自体を条件付きにすることで、両方を回避できます。

于 2014-03-17T23:24:24.360 に答える
30

次のコマンドをダウンロードSigcheckして使用します。

sigcheck.exe -a -u -e 

署名付き dll の例

File version:   0.0.0.0
Strong Name:    Signed

署名されていない dll の例

File version:   0.0.0.0
Strong Name:    Unsigned

Sigcheckファイルのバージョン番号を表示するコマンドライン ユーティリティです。幸運を

于 2013-06-17T23:09:16.310 に答える
14

Web で別のオプション (純粋な .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;

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)");
        }
    }
}
于 2015-12-10T11:39:37.993 に答える
13

外部ツールが必要な場合は、signtool.exe を使用できます。これは Windows SDK の一部であり、コマンド ライン引数を取ります。詳細については、http://msdn.microsoft.com/en-us/library/aa387764.aspxを参照してください。

于 2009-03-20T17:14:47.993 に答える