【问题标题】:Certificate Friendly Name证书友好名称
【发布时间】:2012-05-25 14:51:50
【问题描述】:

当我使用以下代码将证书存储在机器上时,我试图在证书上设置友好名称:

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 时,它再次截断名称。知道我做错了什么以及如何纠正吗?

【问题讨论】:

    标签: c++ certificate cryptoapi


    【解决方案1】:

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

    【讨论】:

    • 这正是我正在做的。如果对 cbData 使用友好名称的长度 + 1,则字符串将被截断到其长度的一半左右。
    • @DrewBurcett:在您问题的第二部分中,您使用了(BYTE *)"Temp Name." 而不是Unicode 字符串,并使用了一些不清楚的常量32 来表示数据大小(以字节为单位)。我发布的代码是从我的旧工作程序中获得的。因此,如果您只使用正确的字符串格式并指定正确的数据长度,这真的很有效。
    • 第二组源代码直接取自微软网站上的一个示例。第一组源代码(与您的完全一样)是我试图在我的代码中使用的。
    • @DrewBurcett:你试过我发布的代码吗?你能验证它是否有效吗?这不是你想要的吗?
    • 是的。使用 lstrlenw() + 1 时,证书中的友好名称将被截断到其长度的一半左右。
    猜你喜欢
    • 2010-11-27
    • 2018-09-12
    • 2015-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-10
    • 1970-01-01
    相关资源
    最近更新 更多