2012-05-25 7 views
0

Я пытаюсь установить дружественное имя на сертификате, когда я храню, что сертификат на машине со следующим кодом:Сертификат дружественное имя

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

Чтобы установить CERT_FRIENDLY_NAME_PROP_ID свойство с помощью CertSetCertificateContextProperty вам нужно инициализировать 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 
} 
+0

Это именно то, что я делаю. Если вы используете длину дружественного имени + 1 для cbData, строка усекается примерно до половины ее длины. –

+0

@DrewBurchett: Во второй части вопроса вы использовали '(BYTE *)« Temp Name. »Вместо строки Unicode и использовали некоторую непонятную константу' 32' для размера данных в байтах. Код, который я опубликовал, я получил из своей старой рабочей программы. Таким образом, это действительно работает, если вы просто используете правильный формат строки и указываете правильную длину данных. – Oleg

+0

Второй набор исходных кодов вытаскивается непосредственно из примера на сайте Microsoft. Первый набор исходного кода (который точно так же, как ваш) - это то, что я пытаюсь использовать в своем коде. –