CertNameToStrW 函数 (wincrypt.h)

CertNameToStr 函数将 CERT_NAME_BLOB 结构中的编码名称转换为以 null 结尾的字符串。

字符串表示形式遵循 RFC 1779中的可分辨名称规范。 以下“备注”部分列出了此规则的例外。

语法

DWORD CertNameToStrW(
  [in]  DWORD           dwCertEncodingType,
  [in]  PCERT_NAME_BLOB pName,
  [in]  DWORD           dwStrType,
  [out] LPWSTR          psz,
  [in]  DWORD           csz
);

参数

[in] dwCertEncodingType

用于对名称进行编码的 证书编码类型。 此函数忽略高 WORD 中包含的 消息编码类型 标识符。

此参数可以是以下当前定义的证书编码类型。

价值 意义
X509_ASN_ENCODING
1 (0x1)
指定 X.509 证书编码。

[in] pName

指向要转换 CERT_NAME_BLOB 结构的指针。

[in] dwStrType

此参数指定输出字符串的格式。 此参数还指定字符串内容的其他选项。

此参数可以是下列值之一。

价值 意义
CERT_SIMPLE_NAME_STR
1
将丢弃所有 对象标识符(OID)。 CERT_RDN 项用逗号分隔,后跟空格(, )。 CERT_RDN 中的多个属性用空格(+)括起来的加号分隔,例如,Microsoft、Kim Abercrombie + 程序员。
CERT_OID_NAME_STR
2
OID 包含在其属性值中的等号 (=) 分隔符中。 CERT_RDN 项用逗号分隔,后跟空格(, )。 CERT_RDN 中的多个属性由加号隔开,后跟空格(+ )。
CERT_X500_NAME_STR
3
OID 转换为其 X.500 密钥名称;否则,它们与 CERT_OID_NAME_STR相同。 如果 OID 没有相应的 X.500 名称,则 OID 与 OID 前缀一起使用。

如果 RDN 值包含前导空格或尾随空格或以下字符之一,则引用 RDN 值:

  • 逗号 (,)
  • 加号 (+)
  • 等号 (=)
  • 英寸标记 (“)
  • 反斜杠后跟字母 n (\n)
  • 小于符号 (<)
  • 大于符号 (>)
  • 数字符号 (#)
  • 分号 (;)
引号是一个英寸标记()。 如果 RDN 值包含一个英寸标记,则它括在引号(“)内。
 

还可以将以下选项与上述值组合在一起,以指定字符串的其他选项。

价值 意义
CERT_NAME_STR_SEMICOLON_FLAG
0x40000000
将后跟空格(,)分隔符的逗号替换为后跟空格(; )分隔符的分号。
CERT_NAME_STR_CRLF_FLAG
0x08000000
将逗号后跟空格 (, ) 分隔符替换为反斜杠,后跟后跟反斜杠,后跟字母 n (\r\n) 分隔符。
CERT_NAME_STR_NO_PLUS_FLAG
0x20000000
将括在空格 (+) 分隔符内的加号替换为单个空格分隔符。
CERT_NAME_STR_NO_QUOTING_FLAG
0x10000000
禁用引用。
CERT_NAME_STR_REVERSE_FLAG
0x02000000
解码后,可分辨名称字符串中的 RDN 顺序将反转。 默认情况下不设置此标志。
CERT_NAME_STR_DISABLE_IE4_UTF8_FLAG
0x00010000
默认情况下,CERT_RDN_T61_STRING X.500 密钥字符串将解码为 UTF8。 如果 UTF8 解码失败,X.500 密钥将解码为 8 位字符。 使用CERT_NAME_STR_DISABLE_IE4_UTF8_FLAG跳过最初尝试解码为 UTF8。
CERT_NAME_STR_ENABLE_PUNYCODE_FLAG
0x00200000
如果 pName 参数指向的名称包含电子邮件 RDN,并且电子邮件地址的主机名部分包含一个 Punycode 编码 IA5String,则名称将转换为 Unicode 等效项。

Windows Server 2008、Windows Vista、Windows Server 2003 和 Windows XP:不支持此值。

[out] psz

指向接收返回字符串的字符缓冲区的指针。 此缓冲区的大小在 csz 参数中指定。

[in] csz

psz 缓冲区的大小(以字符为单位)。 大小必须包含终止 null 字符。

返回值

返回转换的字符数,包括终止 null 字符。

如果 pszNULLcsz 为零,则返回目标字符串所需的大小。

言论

如果 pszNULL,并且 csz 不为零,则返回的 psz psz 始终是以 null 结尾的字符串。

建议不要使用多组件 RDN(例如 CN=James+O=Microsoft),以避免在解码发生时可能出现的排序问题。 相反,请考虑使用单值 RDN(例如,CN=James,O=Microsoft)。

字符串表示形式遵循 RFC 1779 RFC 1779 中的可分辨名称规范,但以下列表中的偏差除外。

  • 包含引号的名称括在双引号内。
  • 空字符串括在双引号内。
  • 包含连续空格的字符串不会括在引号中。
  • CERT_RDN_ENCODED_BLOBCERT_RDN_OCTET_STRING 类型的相对可分辨名称(RDN)值采用十六进制格式。
  • 如果 OID 没有相应的 X.500 名称,则会在 OID 之前使用“OID”前缀。
  • 如果 RDN 值包含前导空格、尾随空格或下列字符之一,则用双引号(而不是“\”)括起来:
    • 逗号 (,)
    • 加号 (+)
    • 等号 (=)
    • 英寸标记 (“)
    • 反斜杠 (/)
    • 小于符号 (<)
    • 大于符号 (>)
    • 数字符号 (#)
    • 分号 (;)
  • stateOrProvinceName (2.5.4.8) OID 的 X.500 密钥名称为“S”。 此值与 RFC 1779 X.500 密钥名称(“ST”)不同。
此外,RFC 1779 中未提及以下 X.500 密钥名称,但此 API 可能返回:
钥匙 对象标识符字符串
E 1.2.840.113549.1.9.1
T 2.5.4.12
G 2.5.4.42
2.5.4.43
2.5.4.4
 

例子

有关使用此函数的示例,请参阅

示例 C 程序:将名称从证书转换为 ASN.1 并返回

注意

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

要求

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

另请参阅

CertRDNValueToStr

CertStrToName

数据转换函数