PowerShell原生方式获取证书SAN字段为空问题排查
解决PowerShell原生提取证书SANs为空的问题
直接通过OID 2.5.29.17获取的证书扩展数据是ASN.1二进制编码格式,无法直接读取内容,这就是你提取结果为空的原因。以下是PowerShell原生实现的正确提取并格式化SANs的代码:
# 指定目标URI $targetUri = "https://your-target-domain.com" # 初始化请求并获取证书 $webRequest = [System.Net.HttpWebRequest]::Create($targetUri) $webRequest.Method = "HEAD" try { $null = $webRequest.GetResponse() } catch { # 从SSL异常中提取证书 $certificate = $_.Exception.InnerException.ServerCertificate } # 定位SAN扩展 $sanExtension = $certificate.Extensions | Where-Object { $_.Oid.Value -eq "2.5.29.17" } if ($sanExtension) { # 解码ASN.1格式的SAN数据 $asnDecoder = New-Object System.Security.Cryptography.AsnEncodedData($sanExtension.Oid, $sanExtension.RawData) $decodedSan = $asnDecoder.Format($true) # 提取并格式化各类SAN条目(DNS/IP/URI等) $sanList = $decodedSan -split "`r`n" | ForEach-Object { switch -Regex ($_) { "DNS Name=(.*)" { $matches[1] } "IP Address=(.*)" { $matches[1] } "URI=(.*)" { $matches[1] } "RFC822 Name=(.*)" { $matches[1] } } } | Where-Object { $_ } # 输出结果 Write-Host "证书Subject Alternative Names:" $sanList | ForEach-Object { Write-Host "- $_" } } else { Write-Host "该证书未配置Subject Alternative Names" }
关键说明:
- 使用
System.Security.Cryptography.AsnEncodedData类解码SAN扩展的二进制原始数据,这是.NET/PowerShell原生提供的ASN.1解析工具,无需额外依赖。 - 通过
Format($true)方法将编码数据转为可读的文本格式,再通过正则匹配提取不同类型的SAN条目。 - 代码兼容DNS、IP、URI、邮箱等常见SAN类型,可根据需求调整匹配规则。
内容的提问来源于stack exchange,提问作者Bopskies
相关产品推荐
相关产品推荐

