使用Powershell检索x509证书'Description'属性

时间:2018-04-25 09:25:41

标签: powershell ssl-certificate x509certificate

我正在尝试撤回Windows证书的description属性。它不是标准的x509证书属性。

我发现的唯一参考是使用capicom(How can I access Certificate ExtendedProperties using powershell?),现在它不受支持,无论如何都不会帮助我,因为我将远程运行它。

有没有人知道访问此属性的任何其他方法?

由于

1 个答案:

答案 0 :(得分:0)

那么,在发布的那一刻,这两条评论都没有任何正确或相关的评论。描述不是X.509证书对象的一部分,它是特定于供应商的(在当前情况下为Microsoft)附加属性。该物业通过证书商店附加,并不存在于其外。

PowerShell和.NET也不提供本地方式来从证书中读取存储附加属性(但是,有些东西,如Friendly Name可用)。相反,您需要通过p / invoke调用CertGetCertificateContextProperty非托管函数:

$Cert = gi Cert:\CurrentUser\My\510F2809B505D9B32F167F6E71001B429CE801B8
$signature = @"
[DllImport("Crypt32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern bool CertGetCertificateContextProperty(
    IntPtr pCertContext,
    uint dwPropId,
    Byte[] pvData,
    ref uint pcbData
);
"@
Add-Type -MemberDefinition $signature -Namespace PKI -Name Crypt32
$pcbData = 0
# if the function returns False, then description is not specified.
$CERT_DESCRIPTION_PROP_ID = 13
if ([PKI.Crypt32]::CertGetCertificateContextProperty($Cert.Handle,$CERT_DESCRIPTION_PROP_ID,$null,[ref]$pcbData)) {
    # allocate a buffer to store property value
    $pvData = New-Object byte[] -ArgumentList $pcbData
    # call the function again to write actual data into allocated buffer
    [void][PKI.Crypt32]::CertGetCertificateContextProperty($Cert.Handle,$CERT_DESCRIPTION_PROP_ID,$pvData,[ref]$pcbData)
    # Description is null-terminated unicode string
    $description = [Text.Encoding]::Unicode.GetString($pvData).TrimEnd()
}
Write-Host $description

使用您用于检索证书的行更改第一行。证书对象必须存储在$cert变量中。