如何在PowerShell 7.3+中获取已签名文件的TBS值?
在PowerShell 7.3及以上版本获取带签名文件的TBS哈希值
需求说明
- 需要获取带数字签名文件的TBS(待签名)哈希值,该值对应ConfigCI模块输出XML中的内容
Get-AuthenticodeSignature无法获取此值- 目标证书未安装在本地证书存储中
- 根据微软文档,TBS值为哈希,知名根证书的TBS哈希已内置在Windows Defender应用控制代码中
已尝试步骤
Add-Type -AssemblyName System.Security.Cryptography.X509Certificates $cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 -ArgumentList <文件路径> $RawData = $cert.RawData
解决方案
要提取TBS哈希,需解析证书的ASN.1结构,提取TBSCertificate部分后计算哈希。以下是PowerShell实现步骤:
完整代码示例
Add-Type -AssemblyName System.Security.Cryptography.X509Certificates Add-Type -AssemblyName System.Security.Cryptography # 加载目标证书(无需安装到本地存储) $certPath = "<你的证书文件路径>" $cert = [System.Security.Cryptography.X509Certificates.X509Certificate2]::new($certPath) # 解析DER编码的证书,提取TBSCertificate部分 $asnReader = [System.Security.Cryptography.Asn1.AsnReader]::new($cert.RawData, [System.Security.Cryptography.Asn1.AsnEncodingRules]::Der) $certSequence = $asnReader.ReadSequence() # 证书序列第一个元素即为TBSCertificate $tbsBytes = $certSequence.ReadEncodedValue().ToArray() # 计算TBS部分的SHA256哈希(与ConfigCI输出格式一致) $hashAlgorithm = [System.Security.Cryptography.SHA256]::Create() $tbsHash = $hashAlgorithm.ComputeHash($tbsBytes) # 转换为小写十六进制字符串 $tbsHashHex = [BitConverter]::ToString($tbsHash).Replace("-", "").ToLower() # 输出结果 Write-Host "TBS哈希值:$tbsHashHex"
关键说明
- 利用.NET原生的
AsnReader解析证书的DER编码结构,无需第三方工具 - 提取的TBSCertificate是证书中待签名的原始数据块,其哈希即为ConfigCI XML中记录的TBS值
- 输出的十六进制字符串格式与ConfigCI模块生成的内容完全匹配
内容的提问来源于stack exchange,提问作者SpyNet
相关产品推荐
相关产品推荐

