我有一个签名文件,由于某种原因无法使用下面的代码在 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
突出显示的证书未显示在命令行中
这似乎是预期的并且是设计使然的。
签名验证上下文中的证书链引擎尽可能使用存储在签名中的证书。仅当找不到匹配的证书时,它才会查找外部存储。
这里发生了什么:两个链共享相同的中间 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
将返回相同的链。