使用PowerShell提取证书颁发者与主体通用名的问题
解决PowerShell提取证书颁发者/主体通用名时的逗号问题
你的代码失效的原因是:直接用逗号分割证书的Issuer/Subject字符串,会把通用名(CN)里转义过的逗号(比如MyCompany\, Inc.中的\,)当成分割符,导致CN值被错误拆分。
正确的单行命令
Get-AuthenticodeSignature .\test.exe | ForEach-Object { $cert=$_.SignerCertificate; $issuerDN=New-Object System.Security.Cryptography.X509Certificates.X500DistinguishedName $cert.Issuer; $subjectDN=New-Object System.Security.Cryptography.X509Certificates.X500DistinguishedName $cert.Subject; ($cert.Thumbprint, ($issuerDN.Name -split '=',2)[1] -replace '\\,',',', ($subjectDN.Name -split '=',2)[1] -replace '\\,',',', $cert.NotAfter) -join ',' }
关键处理逻辑
- 用
X500DistinguishedName类解析证书的颁发者/主体DN,这是系统提供的标准解析方式,能正确识别转义字符 - 用
-split '=',2只拆分CN属性名和值之间的第一个等号,确保完整提取包含逗号的CN值 - 用
-replace '\\,', ','把DN中转义的逗号恢复成普通逗号,还原真实的通用名
拆分版(便于理解)
如果觉得单行太紧凑,也可以写成多行版看清楚逻辑:
Get-AuthenticodeSignature .\test.exe | ForEach-Object { # 提取证书对象 $cert = $_.SignerCertificate # 解析颁发者DN $issuerDN = New-Object System.Security.Cryptography.X509Certificates.X500DistinguishedName $cert.Issuer # 提取颁发者CN并还原转义逗号 $issuerCN = ($issuerDN.Name -split '=',2)[1] -replace '\\,', ',' # 解析主体DN $subjectDN = New-Object System.Security.Cryptography.X509Certificates.X500DistinguishedName $cert.Subject # 提取主体CN并还原转义逗号 $subjectCN = ($subjectDN.Name -split '=',2)[1] -replace '\\,', ',' # 拼接输出内容 ($cert.Thumbprint, $issuerCN, $subjectCN, $cert.NotAfter) -join ',' }
内容的提问来源于stack exchange,提问作者fhcat
相关产品推荐
相关产品推荐

