如何在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
相关产品推荐
相关产品推荐

