Digital certificate 如何检查文件是否具有数字签名

Digital certificate 如何检查文件是否具有数字签名,digital-certificate,Digital Certificate,我想通过编程检查文件是否经过数字签名 目前,我发现了一个相当模糊的,不可编译的 对这个问题有什么想法吗 顺便说一句,带命令行的外部工具也不错。如果需要外部工具,可以使用signtool.exe。它是Windows SDK的一部分,使用命令行参数,您可以在此处找到更多信息,下载并使用以下命令 sigcheck.exe -a -u -e 签名dll的一个示例 无符号dll的一个示例 Sigcheck是一个显示文件版本号的命令行实用程序。祝你好运提到signtool的答案中缺少的重要部分是:

我想通过编程检查文件是否经过数字签名

目前,我发现了一个相当模糊的,不可编译的

对这个问题有什么想法吗


顺便说一句,带命令行的外部工具也不错。

如果需要外部工具,可以使用signtool.exe。它是Windows SDK的一部分,使用命令行参数,您可以在此处找到更多信息,

下载并使用以下命令

sigcheck.exe -a -u -e 
签名dll的一个示例

无符号dll的一个示例


Sigcheck是一个显示文件版本号的命令行实用程序。祝你好运

提到signtool的答案中缺少的重要部分是:

是的,使用著名的signtool.exe,您还可以了解文件是否已签名。无需下载其他工具

例如,使用简单的行:

signtool verify /pa myfile.exe
if %ERRORLEVEL% GEQ 1 echo This file is not signed.
(对于详细输出,请在“/pa”之后添加“/v”。)

有人可能会问:为什么这很重要?我只是(再次)在文件上签了名,然后就可以了

我的目标是保持构建干净,不要再次签署文件,因为不仅日期改变了,而且之后的二进制文件也不同了

商业实例: 我的客户有一个简化的自动化“开发操作”类构建和构建后流程。不同的文件集有多个源,最终所有的文件都是构建、测试和绑定到发行版的——为此,一些文件必须签名。为了保证某些文件在未经签名的情况下不会离开该单元,我们对所有重要文件进行签名,即使这些文件已经签名

但这还不够干净:

1) 如果我们再次签署一个已经签署的文件,文件日期和二进制指纹会发生变化,如果文件只是被复制,那么该文件将失去与其来源的可比性。 (至少如果你签上时间戳,我们总是这样做,我认为这是强烈建议。)

这是一个严重的质量损失,因为此文件不再与其他文件源中的前辈具有可比性

2) 如果我们再次签署文件,这也可能是一个错误,这是一个第三方文件,不应该由您的单位签署

您可以通过根据前面提到的“signtool verify”调用的返回代码使签名本身具有条件来避免这两种情况。

我在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;

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)");
            }
        }
    }
}
选择
.exe
右键单击>属性。如果文件已签名,则您将在该文件的属性窗口上获得此选项卡


您也可以尝试使用npm软件包
签名检查

此软件包实现WinVerifyTrust API并具有简单的用法:

npm install -g sign-check

sign-check 'path/to/file'

自Powershell 5.1以来,您可以使用验证二进制或Powershell脚本的签名

> Get-AuthenticodeSignature -FilePath .\MyFile.exe

SignerCertificate                 Status        Path                                                                                   
-----------------                 ------        ----                                                                                   
A59E92E31475F813DDAF41C3CCBC8B78  Valid         MyFile.exe   


你能在你的问题中指定一种语言吗,或者说你不介意。这将使回答更容易。谢谢。你为什么要使用两个名为Vinzz的帐户?…并问完全相同的问题?请原谅?对于这两个帐户,您会注意到其中一个已注册,另一个未注册。直到最近,我还遇到了浏览器问题,无法登录,因此我使用了未注册的Vinzz帐户。但是,您在哪里看到了两个相同的问题?MSDN示例在VisualStudio 2008中为我编译,没有任何错误。如果您收到编译器警告,则可能没有正确安装平台SDK。如果您需要一个独立的工具,那么sigcheck将执行您需要的操作注意,它检索用于签署文件的证书,但它不会验证文件的签名是否有效(即,如果您篡改文件,此方法仍将返回原始签名者,它不会提醒您该文件已被篡改)需要正确处理X509证书和X509Chain对象。建议使用语句将它们包装在
中。您在顶部添加的链接不再有效。我不认为这有助于“以编程方式”验证文件是否进行了数字签名:)这个答案实际上对我有帮助哇,这个答案太糟糕了@JerryGoyal:数字签名的存在并不意味着什么。通过转到“数字签名”,选择“签名”,然后选择“详细信息”,并检查顶部是否显示“数字签名正常”,以确保其有效。即使对于system exe
signtool verify/pa c:\Windows\regedit.exe
> (Get-AuthenticodeSignature -FilePath .\MyFile.exe).Status
Valid