CertGetNameStringA 函数 (wincrypt.h)

CertGetNameString 函数从证书 CERT_CONTEXT 结构中获取使用者或颁发者名称,并将其转换为 null终止的字符串。

语法

DWORD CertGetNameStringA(
  [in]  PCCERT_CONTEXT pCertContext,
  [in]  DWORD          dwType,
  [in]  DWORD          dwFlags,
  [in]  void           *pvTypePara,
  [out] LPSTR          pszNameString,
  [in]  DWORD          cchNameString
);

参数

[in] pCertContext

指向 CERT_CONTEXT 证书上下文的指针,其中包含要转换的使用者和颁发者名称。

[in] dwType

DWORD 指示如何找到名称以及如何设置输出的格式。

价值 意义
CERT_NAME_EMAIL_TYPE
1
如果证书具有使用者可选名称扩展或颁发者可选名称,请使用第一个 rfc822Name 选项。 如果在扩展中找不到 rfc822Name 选项,请使用电子邮件 OID 的“使用者名称”字段。 如果找到 rfc822Name 或 Email OID,请使用字符串。 否则,返回一个空字符串(返回的字符计数为 1)。 不使用 pvTypePara,并且设置为 NULL
CERT_NAME_RDN_TYPE
2
通过调用 CertNameToStr来转换使用者名称 BLOB。 pvTypePara 指向 DWORD,其中包含传递给 CertNameToStrdwStrType。 如果“使用者名称”字段为空,并且证书具有使用者可选名称扩展,请使用 CertNameToStr中的第一个目录名称选择。
CERT_NAME_ATTR_TYPE
3
pvTypePara 指向指定要返回的名称属性(OID)对象标识符。 例如,如果 pvTypePara 为szOID_COMMON_NAME,请使用使用者名称成员。 如果使用者名称成员为空,并且证书具有使用者可选名称扩展,请使用第一个 directoryName 选项。
CERT_NAME_SIMPLE_DISPLAY_TYPE
4
循环访问以下名称属性列表,并在第一次出现时使用使用者名称或使用者可选名称扩展:szOID_COMMON_NAME、szOID_ORGANIZATIONAL_UNIT_NAME、szOID_ORGANIZATION_NAME或szOID_RSA_emailAddr。

如果未找到其中一个属性,请使用 rfc822Name 选项的使用者可选名称扩展。 如果没有匹配项,请使用第一个属性。

不使用 pvTypePara,并且设置为 NULL

CERT_NAME_FRIENDLY_DISPLAY_TYPE
5
检查证书是否有CERT_FRIENDLY_NAME_PROP_ID属性。 如果证书具有此属性,则返回它。 如果证书没有该属性,则返回CERT_NAME_SIMPLE_DISPLAY_TYPE。
CERT_NAME_DNS_TYPE
6
如果证书具有颁发者使用者可选名称扩展,颁发者可选名称,请搜索第一个 DNSName 选项。

如果在扩展中找不到 DNSName 选项,请在 CN OID 的“使用者名称”字段中搜索“2.5.4.3”。

如果找到 DNSName 或 CN OID,则返回字符串。 否则,返回空字符串。

CERT_NAME_URL_TYPE
7
如果证书具有颁发者使用者可选名称扩展,颁发者可选名称,请搜索第一个 URL 选项。 如果找到 URL 选项,则返回字符串。 否则,返回空字符串。
CERT_NAME_UPN_TYPE
8
如果证书具有使用者可选名称扩展,请在其他名称选项中搜索查找 pszObjId == szOID_NT_PRINCIPAL_NAME(“1.3.6.1.4.1.311.20.2.3”)。

如果找到 UPN OID,将 BLOB 解码为X509_UNICODE_ANY_STRING并返回解码的字符串。 否则,返回空字符串。

[in] dwFlags

指示所需的处理类型。

价值 意义
CERT_NAME_ISSUER_FLAG
0x1
获取颁发者的名称。 如果未设置,则获取使用者的名称。
CERT_NAME_DISABLE_IE4_UTF8_FLAG
0x00010000
跳过将值解码为 UTF8 的默认初始尝试,并将该值解码为 8 位字符。
CERT_NAME_SEARCH_ALL_NAMES_FLAG
0x2
如果 dwType 参数设置为 CERT_NAME_DNS_TYPE,则会返回指定 DNS 值的所有适用名称。 如果没有 DNS 名称,但主题中有 CN 组件,则改为返回 CN。 如果有 CN 和 DNS 名称,则仅返回 DNS 名称。 这会模拟 SSL 链生成策略。 如果为非 CERT_NAME_DNS_TYPE的名称类型设置此标志,此函数将返回以 null 结尾的空字符串。

Windows 8 和 Windows Server 2012:对此标志的支持开始。

CERT_NAME_STR_ENABLE_PUNYCODE_FLAG
0x00200000
此标志基于以下定义的 dwType 参数值,将 IA5String 字符串解码为 Unicode 字符串值:
  • CERT_NAME_EMAIL_TYPE:如果电子邮件地址的主机名部分包含一个 Punycode 编码 IA5String 组件,则会转换为 Unicode 等效组件。
  • CERT_NAME_SIMPLE_DISPLAY_TYPE:如果使用者可选名称的使用者名称 szOID_RSA_emailAddr或使用者可选名称中的 rfc822Name 从证书返回,并且电子邮件地址的主机名部分包含 Punycode 编码的 IA5String 组件,则会将其转换为 Unicode 等效项。
  • CERT_NAME_DNS_TYPE:如果证书具有具有 DNSName 选项的颁发者可选名称,并且电子邮件地址的主机名部分包含已编码的 punycode IA5String 组件,则会将其转换为 Unicode 等效项。
  • CERT_NAME_URL_TYPE:URI 已解码且未转义。 如果 URI 的服务器主机名包含一个 Punycode 编码 IA5String 组件,则主机名字符串将转换为 Unicode 等效项。
Windows Server 2008、Windows Vista、Windows Server 2003 和 Windows XP:不支持此值。

[in] pvTypePara

指向 DWORD 的指针,其中包含 dwStrType 或指定名称属性(OID)的 对象标识符。 指向的类型由 dwType的值确定。

[out] pszNameString

指向分配的缓冲区的指针,用于接收返回的字符串。 如果 pszNameStringNULL,并且 cchNameString 不为零,则 pszNameStringnull终止字符串。

如果在 dwFlags 参数中指定了 CERT_NAME_SEARCH_ALL_NAMES_FLAG,并在 dwType 参数中设置 CERT_NAME_DNS_TYPE,则返回的字符串将包含应用的所有 DNS 名称。 输出字符串中的每个字符串都以 null 结尾,最后一个字符串将以 null 结尾。 如果未找到 DNS 名称,则返回单个以 null 结尾的空字符串。

[in] cchNameString

为返回的字符串分配的大小(以字符为单位)。 大小必须包含终止 NULL 字符。

返回值

返回转换的字符数,包括终止零字符。 如果 pszNameStringNULLcchNameString 为零,则返回目标字符串所需的大小(包括终止 NULL 字符)。 如果未找到指定的名称类型,则返回 null-terminated 空字符串,返回的字符计数为 1。

言论

注意

wincrypt.h 标头将 CertGetNameString 定义为一个别名,该别名根据 UNICODE 预处理器常量的定义自动选择此函数的 ANSI 或 Unicode 版本。 将中性编码别名与不中性编码的代码混合使用可能会导致编译或运行时错误不匹配。 有关详细信息,请参阅函数原型的 约定。

要求

要求 价值
最低支持的客户端 Windows XP [桌面应用 |UWP 应用]
支持的最低服务器 Windows Server 2003 [桌面应用 |UWP 应用]
目标平台 窗户
标头 wincrypt.h
Crypt32.lib
DLL Crypt32.dll

另请参阅

数据转换函数