如何在PowerShell中获取此文件的完整证书路径/链

问题描述 投票:0回答:1

我有一个签名文件,由于某种原因无法使用下面的代码在 PowerShell 中获取其根证书

$FilePath = '.\NordPassSetup_x86.exe'

# Get the certificate from the file path
$Cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 $FilePath

# Build the certificate chain
$Chain = New-Object System.Security.Cryptography.X509Certificates.X509Chain
[void]$Chain.Build($Cert)

$Chain.ChainElements.count

foreach ($Element in $Chain.ChainElements) {
    $Element.Certificate | ft -AutoSize
}

在此处上传文件:https://ufile.io/1j5pleow

输出是 3 个项目,而不是 4 个项目。该文件有 1 个叶证书、1 个根证书和 2 个中间证书。

我尝试跳过根证书检查并将检查设置为离线,但没有帮助

[System.Security.Cryptography.X509Certificates.X509RevocationMode]::Offline

[System.Security.Cryptography.X509Certificates.X509RevocationFlag]::ExcludeRoot

突出显示的证书未显示在命令行中

powershell certificate x509certificate x509certificate2 powershell-7.3
1个回答
0
投票

这似乎是预期的并且是设计使然的。

签名验证上下文中的证书链引擎尽可能使用存储在签名中的证书。仅当找不到匹配的证书时,它才会查找外部存储。

这里发生了什么:两个链共享相同的中间 CA 证书 (

GlobalSign Extended Validation CodeSigning CA - SHA256 - G3
)。然后,签名包含另一个中间 CA 证书(
GlobalSign
),它是 EV 代码签名 CA 的颁发者,因此签名验证器使用它。发行人是
GlobalSign Root CA R1
。这有效地产生了 4 个元素的链(从根到叶):

  • GlobalSign Root CA - R1
  • GlobalSign
  • GlobalSign Extended Validation CodeSigning CA - SHA256 - G3
  • TEFINCOM S.A.

签名中第二个证书的存在迫使签名验证器使用它,从而将链扩展了一个元素。

X509Chain
不遵守这一要求,而是构建尽可能多的链,然后选择最好的一条,然后将其返回给调用者。

在下面,

X509Chain
将产生这两条链,一条以
GlobalSign Root CA - R1
结尾,另一条以
GlobalSign Root CA - R3
结尾。两条链都是有效的,但第二条链更短(更好)并且证书链引擎返回它。
GlobalSign Root CA - R1
GlobalSign Root CA - R3
都共享相同的公钥,因此都可以用来验证链。

如果签名中缺少额外的

GlobalSign
证书,则签名 UI 查看器和
X509Chain
将返回相同的链。

© www.soinside.com 2019 - 2024. All rights reserved.