当我将该证书存储在具有以下代码的计算机上时,我试图在证书上设置友好名称:
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时,它再次截断名称。知道我做错了什么以及如何纠正它?
答案 0 :(得分:0)
要使用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
}