C++ 证书友好名称

C++ 证书友好名称,c++,certificate,cryptoapi,C++,Certificate,Cryptoapi,当我将证书存储在具有以下代码的计算机上时,我试图在证书上设置友好名称: CRYPT_DATA_BLOB fName = {_tcslen(FriendlyName) * sizeof(TCHAR), FriendlyName}; CertSetCertificateContextProperty(certContext, CERT_FRIENDLY_NAME_PROP_ID, 0, &fName)); 其中,FriendlyName显然是指向友好名称的LPWSTR,certContex

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

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};
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
}

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

要使用设置
CERT\u-FRIENDLY\u-NAME\u-PROP\u-ID
属性,需要首先初始化
CRYPT\u-DATA\u-BLOB
,然后将其用作
CertSetCertificateContextProperty
的最后一个参数。代码可能与以下内容有关:

BYTE *pName = (BYTE *)"Temp Name.";
CRYPT_DATA_BLOB  Friendly_Name_Blob={32,pName};
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
}

要使用设置
CERT\u-FRIENDLY\u-NAME\u-PROP\u-ID
属性,首先需要初始化
CRYPT\u-DATA\u-BLOB
,然后将其用作
CertSetCertificateContextProperty
的最后一个参数。代码可能与以下内容有关:

BYTE *pName = (BYTE *)"Temp Name.";
CRYPT_DATA_BLOB  Friendly_Name_Blob={32,pName};
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
}

这正是我正在做的。如果您对cbData使用友好名称+1的长度,字符串将被截断为其长度的一半左右。@DrewBurchett:在问题的第二部分中,您使用了
(BYTE*)“Temp name.”
而不是Unicode字符串,并使用了一些不明确的常量
32
来表示以字节为单位的数据大小。我发布的代码来自我以前的工作程序。因此,如果您只使用正确的字符串格式并指定正确的数据长度,那么这真的很有效。第二组源代码直接取自Microsoft网站上的一个示例。第一组源代码(与您的完全相同)是我试图在代码中使用的。@DrewBurchett:您尝试过我发布的代码吗?你能核实一下它是否有效吗?这不是你想要的吗?是的。当使用lstrlenw()+1时,证书中的友好名称将被截断为其长度的一半。这正是我要做的。如果您对cbData使用友好名称+1的长度,字符串将被截断为其长度的一半左右。@DrewBurchett:在问题的第二部分中,您使用了
(BYTE*)“Temp name.”
而不是Unicode字符串,并使用了一些不明确的常量
32
来表示以字节为单位的数据大小。我发布的代码来自我以前的工作程序。因此,如果您只使用正确的字符串格式并指定正确的数据长度,那么这真的很有效。第二组源代码直接取自Microsoft网站上的一个示例。第一组源代码(与您的完全相同)是我试图在代码中使用的。@DrewBurchett:您尝试过我发布的代码吗?你能核实一下它是否有效吗?这不是你想要的吗?是的。使用lstrlenw()+1时,证书中的友好名称将被截断为其长度的一半左右。