1

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

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

显然,FriendlyName 是指向友好名称的 LPWSTR,而 certContext 是将证书保存在商店中的有效证书上下文。该功能正常工作,并将名称写入证书。但是,当我在证书管理单元中查看它时,名称的最后一个字母被截断。我试过在名字的长度上加一个,最后把名字减半。我检查了 FriendlyName 和长度,以确保它们正确无误。如果我将 FriendlyName 更改为 LPSTR,它会显示为 Kanjii 字符。在 Microsoft 提供的示例中,他们执行以下操作:

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

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

4

1 回答 1

1

要使用CertSetCertificateContextProperty设置CERT_FRIENDLY_NAME_PROP_ID属性,您需要先初始化,然后将其用作. 该代码可能与以下内容有关:CRYPT_DATA_BLOBCertSetCertificateContextProperty

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
}
于 2012-05-29T08:59:30.810 回答