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 exesigntool verify/pa c:\Windows\regedit.exe
> (Get-AuthenticodeSignature -FilePath .\MyFile.exe).Status
Valid