c++ - 证书友好名称

标签 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,它会显示为汉字字符。在 Microsoft 提供的示例中,他们执行以下操作:

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

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

最佳答案

使用 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
}

关于c++ - 证书友好名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10756601/

相关文章:

c++ - 想要本地驱动器上的文件,但它总是在项目文件夹中创建

c++ - 如何将新字符串重写到文本文件中的特定位置

proxy - Jmeter 代理服务器错误 "Illegal option: -ext"

c++ - 带密码学 API C/C++ 的 HMAC

java - NIST SP 800-56A 级联/单步 key 推导函数的现有实现?

c++ - 我们如何确保传递的 2 个参数被视为第一个和第三个,而第二个和第四个被视为默认值

c++ - 读取 vector 时出现段错误

Java 9 弃用 SHA1 证书,还是其他问题?

ssl - 如何将中间证书添加到 pfx 文件

winapi - 地穴导出 key : how to export private key from PKCS#12 store?