1

次のコードを使用して、証明書をマシンに保存するときに、証明書にフレンドリ名を設定しようとしています。

CRYPT_DATA_BLOB fName = {_tcslen(FriendlyName) * sizeof(TCHAR), FriendlyName};
CertSetCertificateContextProperty(certContext, CERT_FRIENDLY_NAME_PROP_ID, 0, &fName));

ここで、FriendlyName はフレンドリ名を指す LPWSTR であり、certContext は証明書をストアに保存する有効な証明書コンテキストです。関数は正しく機能し、名前は証明書に書き込まれます。ただし、証明書スナップインで表示すると、名前の最後の文字が切り捨てられます。名前の長さに 1 を追加しようとしたところ、名前が半分になってしまいました。FriendlyName と長さをチェックして、それらが正しいことを確認しました。FriendlyName を LPSTR に変更すると、漢字として表示されます。Microsoft が提供する例では、次のことを行います。

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

彼らがどこから 32 を取得したのかはわかりませんし、私が見つけることができる説明も提供していません。32 を使用すると、名前が切り捨てられます。私が間違っていることと、それを修正する方法はありますか?

4

1 に答える 1

1

CertSetCertificateContextPropertyCERT_FRIENDLY_NAME_PROP_IDを使用してプロパティを設定するには、最初に初期化し、それを の最後のパラメーターとして使用する必要があります。コードは次のようになります。CRYPT_DATA_BLOBCertSetCertificateContextProperty

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
}
于 2012-05-29T08:59:30.810 に答える