证书友好名称

时间:2012-05-25 14:51:50

标签: c++ certificate cryptoapi

当我将该证书存储在具有以下代码的计算机上时,我试图在证书上设置友好名称:

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时,它再次截断名称。知道我做错了什么以及如何纠正它?

1 个答案:

答案 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
}