You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PowerShell中获取文件完整证书链?现有代码缺失证书

解决证书链条目缺失问题

问题根源

你当前使用的X509Chain.Build()是用于构建信任验证链,而非提取签名文件中嵌入的所有证书。系统会优先调用本地证书存储中的证书补全链,可能跳过签名文件中已存在于本地的中间证书;若设置了ExcludeRoot,还会自动排除根证书,导致返回的链条目数量与文件实际嵌入的证书数不符。

方法一:提取签名中嵌入的所有证书

要获取文件签名里实际包含的全部证书,应使用Get-AuthenticodeSignature命令,它能直接提取签名嵌入的叶子证书和中间证书:

$FilePath = '.\NordPassSetup_x86.exe'
$sig = Get-AuthenticodeSignature -FilePath $FilePath

# 输出叶子证书
Write-Host "叶子证书:"
$sig.SignerCertificate | Format-Table -AutoSize

# 输出嵌入的中间证书
Write-Host "`n嵌入的中间证书:"
$sig.SignedCerts | Format-Table -AutoSize

# 计算总证书数(叶子+中间)
Write-Host "`n总计证书数:" ($sig.SignedCerts.Count + 1)

注:根证书通常不会嵌入在签名文件中,而是依赖本地信任存储,若你的文件确实嵌入了根证书,可结合证书链验证的方法获取。

方法二:强制X509Chain使用签名内的证书构建完整链

若仍需用X509Chain获取完整链,需修改链策略,禁止系统调用本地存储或下载外部证书,强制使用签名文件内的证书构建:

$FilePath = '.\NordPassSetup_x86.exe'
$Cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 $FilePath

$Chain = New-Object System.Security.Cryptography.X509Certificates.X509Chain
# 配置链策略
$Chain.ChainPolicy.RevocationMode = [System.Security.Cryptography.X509Certificates.X509RevocationMode]::Offline
$Chain.ChainPolicy.DisableCertificateDownloads = $true
$Chain.ChainPolicy.VerificationFlags = [System.Security.Cryptography.X509Certificates.X509VerificationFlags]::AllowUnknownCertificateAuthority
$Chain.ChainPolicy.RevocationFlag = [System.Security.Cryptography.X509Certificates.X509RevocationFlag]::IncludeRoot

[void]$Chain.Build($Cert)

Write-Host "证书链元素数量:" $Chain.ChainElements.Count
foreach ($Element in $Chain.ChainElements) {
    $Element.Certificate | Format-Table -AutoSize
}

参数说明

  • DisableCertificateDownloads = $true:禁止从网络下载缺失的证书
  • VerificationFlags = AllowUnknownCertificateAuthority:允许链中存在未被信任的证书(避免因根证书未在本地信任导致链构建失败)
  • RevocationFlag = IncludeRoot:强制包含根证书在链结果中

内容的提问来源于stack exchange,提问作者SpyNet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 21:12:49