标签: authenticode

为什么在查看证书详细信息之前,数字签名的可执行文件将被视为未签名

运行已经过数字签名的可执行文件时,我得到了一个非常奇怪的结果.

可执行文件使用signtool.exe使用适当的2级代码签名证书(非自生成)进行签名.

在Windows 7计算机上进行测试,如果我启动已签名的可执行文件,我会收到Windows警告对话框,说明Publisher Unknown(即未签名).

但是,如果我然后取消并右键单击可执行文件并转到属性 - >数字签名,签名列表将显示签名证书,然后我可以单击该选项并选择"详细信息"以查看签名的详细信息,显示为"数字签名正常".

此时,如果我启动可执行文件,现在所有突然的窗口都正确识别出exectuable已签名并报告正确的"已验证的发布者".

似乎Windows可能没有在线检查证书,直到我从可执行文件的属性对话框中查看实际的证书详细信息(请注意,启动可执行文件后它不仅仅是一个延迟,我等待的时间不长或者我启动它多少次,它将它视为未签名,直到我进入文件的属性/数字签名).

这是我用于测试的通用Windows 7安装 - 它没有以任何方式进行修改或调整.

这种行为似乎打破了Windows上代码签名的主要目的 - 除非用户知道进入右键单击属性并挖掘证书,否则可执行文件被视为无符号.

有什么我想念的吗?某些方法将可执行文件标记为Windows应该主动检查执行时的证书?

windows digital-certificate authenticode codesign

9
推荐指数
1
解决办法
956
查看次数

为什么签名密钥如此昂贵?

我最近考虑获得一个authenticode签名密钥,并对它们的价格感到震惊.这让我想到 - 大多数类型的签名密钥,无论是Authenticode,SSL等 - 都非常昂贵.

是否有技术上的原因使得维护CA和生成密钥变得昂贵,或者这归结为简单的垄断经济学?

signing code-signing authenticode

9
推荐指数
1
解决办法
942
查看次数

如何从已签名的.Net程序集中读取数字签名信息?

我正在编写一个汇编信息应用程序,用于我们的软件构建过程,并尝试从已签名的.Net程序集中读取数字签名信息.

我想在我的C#代码中执行Windows资源管理器可以通过右键单击已签名的程序集并选择"数字签名"选项卡然后单击"详细信息"按钮来执行的操作.例如

Windows 7资源管理器可以通过右键单击文件属性来完成

数字签名细节

有没有人知道如何在C#中以编程方式执行此操作?我目前正在使用Mono Cecil库从程序集中获取其余信息.非常感谢您的帮助.

c# signed authenticode digital-signature x509certificate

9
推荐指数
1
解决办法
6526
查看次数

有没有办法在Powershell中以编程方式检查文件上的数字签名?

我有一个构建脚本,用于使用数字证书(Microsoft Authenticode)对文件进行签名.我想创建一个测试脚本,检查文件是否成功签名.布尔表示文件上存在任何签名就足够了.

我可以在没有任何扩展的情况下使用PowerShell吗?如果没有,我需要什么?

powershell command-line authenticode

9
推荐指数
1
解决办法
7147
查看次数

使用自签名证书验证Authenticode

如果我有一个不在机器的受信任根证书存储区中的自签名证书,如何在不将该证书添加到受信任的根存储区的情况下验证PE文件是否使用该证书进行了Authenticode签名?

C#是首选,但C++中的答案也很好.

StackOverflow上已经有很多类似的问题,但到目前为止还没有一个可以接受的答案.它必须是Authenticode,我无法将其添加到证书存储区.它也不能是购买的证书,因为它需要更长的有效时间(不论时间戳).

除了复制一大块Mono签名检查代码之外,我不知道Win32或.NET中的解决方案.

code-signing self-signed authenticode digital-signature

9
推荐指数
1
解决办法
285
查看次数

CAPICOM - 验证SignedCode来自没有UI的Trusted Publisher

我在.NET 3.0 C#应用程序中使用CAPICOM来检查exe文件上的Authenticode签名.我需要确保证书列为可信发布者.signedCode.Verify(true)如果证书尚未受信任,则使用将显示对话框,因此用户可以选择是否这样做.但是,signedCode.Verify(false)即使它不是来自受信任的发布者,也要验证签名 - 可能这只是检查证书是否有效.

如何在没有UI的情况下检查文件上的签名是否来自有效且受信任的证书?

c# capicom authenticode digital-signature

8
推荐指数
1
解决办法
1861
查看次数

将Authenticode与ClickOnce WPF应用程序一起使用

好吧,我做的不对,我需要一些帮助.这是发生了什么:

  1. 我收到了Comodo的"真实"Authenticode证书,我付了钱.
  2. 我正在尝试签署和部署用Visual Studio 2012和.NET 4.5编写的WPF应用程序.
  3. 在项目的属性中,我检查了"签署ClickOnce清单"并选择了我的证书.
  4. 我也在使用Comodo的时间戳服务器(http://timestamp.comodoca.com/authenticode)
  5. 在"发布"选项卡和"先决条件"按钮下,我选中了"创建安装程序以安装必备组件".

当我构建和发布时,一切正常!setup.exe是用我的Comodo证书签名的,所以这很好.此外,该.application文件使用Comodo证书签名,我的公司名称显示为发布者 - 这也很好.

问题出现了:将应用程序下载到客户端后,Windows 8会发出有关不受信任程序(MyProgram.exe)的警告,并且发布者不是我的公司名称.因此,除了实际的可执行文件之外,一切都已签名.

我已经尝试添加在obj\Release\MyProgram.exe上使用signtool.exe的后期构建脚本,但是当我尝试安装应用程序时,我收到一个清单错误,指出哈希值不匹配.换句话说,清单是在构建后事件之前生成的.

如何签署我的.exe并维护ClickOnce清单的完整性?有没有一种简单的方法可以做到这一点,还是我必须手动使用mage.exe(我希望不是)?

wpf clickonce authenticode

8
推荐指数
1
解决办法
1221
查看次数

AppxSignature.p7x的结构是什么?

通用Windows应用程序位于.appx文件中,该文件只是一堆文件和元数据的压缩包。大多数元数据文件在 Microsoft 网站上都有详细记录,并且易于解析和/或重新生成。然而 AppxSignature.p7x 仍然是个谜。

从这张图(来源): 在此输入图像描述

AppxSignature.p7x 应该具有 AppxBlockMap.xml 的哈希值、内容和目录哈希值以及签名。但是我找不到 AppxSignature.p7x 文件本身的任何文档。理想情况下,我想使用替代工具来生成和验证此签名,例如 openssl/gnutls 或类似工具。其实际用途是在 Linux 上更新和重新打包应用程序,并为 Windows 应用商店准备 .appxupload 文件。

windows authenticode appx win-universal-app

8
推荐指数
2
解决办法
6664
查看次数

在非Windows平台上签署PowerShell脚本?

我正在开发一个项目,我们使用配置管理远程部署软件,其中一部分将PowerShell脚本提供给Windows服务器,然后执行这些脚本以执行部分​​设置和/或配置.

当前部署方法将脚本写入磁盘,但不关闭文件句柄.这样做是为了通过防止任何其他进程在执行之前篡改文件来使脚本更"安全".为了运行脚本,PowerShell必须从stdin读取它,因为如果它无法获得独占访问权限,它就不会运行脚本.调用看起来像这样:

powershell.exe -Command - < C:\temp\some_name.ps1
Run Code Online (Sandbox Code Playgroud)

这有许多缺点,主要是我无法将参数传递给脚本.另外,从stdin读取大型脚本会因为坏字符,换行符等而变得时髦.

我想用更传统的方法调用脚本,例如

powershell.exe -File C:\temp\some_name.ps1 -Param value ...
Run Code Online (Sandbox Code Playgroud)

但也要保持在执行之前确保没有任何东西可以篡改脚本的精神.为此,我想签署powershell脚本并使用"AllSigned"执行策略运行powershell.

问题在于我无法在目标服务器上真正签署脚本,因为它与运行脚本的PowerShell具有相同的问题...我必须释放独占锁以让PowerShell签署该文件,但它可能会得到篡改.

然后,我决定,如果我可以在服务器上签署脚本,将其提供给目标机器,那将更好.但是,我们的配置管理软件服务器都是Linux,我一直难以找到在Linux上签署PowerShell脚本的方法.Mono支持Authenticode,但开箱即用它只适用于exes和dll.我试过深入了解PowerShell .Net函数,但发现它们使用的是Cryptui.dll,这是特定于Windows的.

在这一点上,我正在抓住,无论如何我可以将签名添加到脚本中,否则我将不得不回退到运行非原生脚本的其他方式.如果可能的话,我希望能够在脚本的字符串表示中计算内存中的签名,但是如果我能得到的话,我将采用基于文件的方法.

linux powershell mono signature authenticode

7
推荐指数
1
解决办法
700
查看次数

Set-Authenticode 似乎错误地签署了指定的程序集

我在使用Set-Authenticodepowershell 函数作为 Azure DevOps 管道的一部分对.NET Standard 2.0 程序集进行签名时遇到问题。我已经编写了一些 powershell 来完成目录中的汇编并将签名应用于文件夹中的每个 DLL:

$project = "${{ parameters.projects }}"; # todo: what about multi-line values here
$folderPath = [System.IO.Directory]::GetParent($project)
$files = Get-ChildItem -Path $folderPath -Filter "*.dll" -Recurse
$securePassword = ConvertTo-SecureString $(CertificatePassword) -AsPlainText -Force
$certificate = Get-PfxCertificate -FilePath $(CodeSignCertificate.secureFilePath) -NoPromptForPassword -Password $securePassword

foreach($file in $files) {
  Write-Host "Setting Authenticode Signature for $file"
  $result = Set-AuthenticodeSignature -FilePath $file -Certificate $certificate -Force -HashAlgorithm SHA256 -IncludeChain All -TimestampServer "http://tsa.starfieldtech.com"
  if ($result.Status.ToString().Contains("Error")) { Write-Error $result.StatusMessage } …
Run Code Online (Sandbox Code Playgroud)

powershell authenticode azure-devops azure-pipelines .net-standard

7
推荐指数
1
解决办法
137
查看次数