当我使用以下代码将证书存储在机器上时,我试图在证书上设置友好名称:
CRYPT_DATA_BLOB fName = {_tcslen(FriendlyName) * sizeof(TCHAR), FriendlyName};
CertSetCertificateContextProperty(certContext, CERT_FRIENDLY_NAME_PROP_ID, 0, &fName));
显然,FriendlyName 是指向友好名称的 LPWSTR,certContext 是将证书保存在商店中的有效证书上下文。该功能正常工作,名称已写入证书。但是,当我在证书管理单元中查看它时,名称的最后一个字母被截断了。我试过在名字的长度上加一,结果把名字减半。我已经检查了 FriendlyName 和长度以确保它们是正确的。如果我将 FriendlyName 更改为 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
}
关于c++ - 证书友好名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10756601/