2012-05-25 181 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字符。在微軟提供的一個例子,他們執行以下操作:

BYTE *pName = (BYTE *)"Temp Name."; 
CRYPT_DATA_BLOB Friendly_Name_Blob={32,pName}; 

我不知道在哪裏,他們得到來自32,也沒有提供,我可以找到一個解釋。當我使用32時,它再次截斷名稱。任何想法我做錯了什麼,以及如何糾正?

回答

0

要設置使用CertSetCertificateContextProperty你需要先初始化CRYPT_DATA_BLOB,然後用它作爲CertSetCertificateContextProperty最後一個參數CERT_FRIENDLY_NAME_PROP_ID財產。代碼可能如下:

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

這正是我正在做的。如果對cbData使用友好名稱+ 1的長度,則該字符串會被截斷爲大約一半的長度。 –

+0

@DrewBurchett:在你問題的第二部分,你使用了'(BYTE *)「Temp Name。」'而不是Unicode字符串,並且使用了一些不清晰的常量'32'來表示數據大小。我發佈的代碼是從舊的工作程序中獲得的。所以如果你只是使用正確的字符串格式並指定正確的數據長度,那真的很有用。 – Oleg

+0

第二組源代碼直接來自微軟網站上的一個例子。第一組源代碼(與您的代碼完全相同)就是我試圖在代碼中使用的代碼。 –