证书友好名称

Certificate Friendly Name

本文关键字:证书      更新时间:2023-10-16

当我使用以下代码将证书存储在计算机上时,我正在尝试在证书上设置友好名称:

CRYPT_DATA_BLOB fName = {_tcslen(FriendlyName) * sizeof(TCHAR), FriendlyName};
CertSetCertificateContextProperty(certContext, CERT_FRIENDLY_NAME_PROP_ID, 0, &fName));

显然,友好名称是指向友好名称的 LPWSTR,而 certContext 是将证书保存在存储中的有效证书上下文。 该函数正常工作,名称已写入证书中。 但是,当我在证书管理单元中查看它时,名称的最后一个字母被截断。 我尝试在名称的长度上添加一个,最终将名称切成两半。 我已经检查了友好名称和长度,以确保它们是正确的。 如果我将友好名称更改为 LPSTR,它将显示为汉字字符。 在 Microsoft 提供的示例中,它们执行以下操作:

BYTE *pName = (BYTE *)"Temp Name.";
CRYPT_DATA_BLOB  Friendly_Name_Blob={32,pName};

我不知道他们从哪里得到32,也没有提供我能找到的解释。 当我使用 32 时,它再次截断名称。 知道我做错了什么以及如何纠正它吗?

要使用 CertSetCertificateContextProperty 设置CERT_FRIENDLY_NAME_PROP_ID属性,您需要首先初始化CRYPT_DATA_BLOB,然后将其用作 CertSetCertificateContextProperty 的最后一个参数。代码可能涉及以下内容:

LPWSTR pszFriendlyName = L"My test friendly name";
CRYPT_DATA_BLOB cryptBlob;
BOOL bResult;
cryptBlob.cbData = (lstrlenW(pszFriendlyName) + 1)*sizeof(WCHAR);
cryptBlob.pbData = (PBYTE)pszFriendlyName;
// pCertContext should be set before
bResult = CertSetCertificateContextProperty (pCertContext,
                                             CERT_FRIENDLY_NAME_PROP_ID,
                                             0, (LPVOID)&cryptBlob);
if (!bResult) {
    // error
}