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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 09:52:40