2.5.4.3=Name Surname, 1.2.300.38.22=12345678
我有一个工作程序,它使用 MS Crypto API从指定的 SubjectDN 字符串(例如:)生成 CSR 。我使用函数:CertStrToName()对其进行编码,一切正常,除了一件事:所有 OID 值都是用 ASN1 type 创建的PrintableString
。
有什么方法可以使 OID 1.2.300.38.22 类型为 1.2.300.38.22 NumericString
?
2.5.4.3=Name Surname, 1.2.300.38.22=12345678
我有一个工作程序,它使用 MS Crypto API从指定的 SubjectDN 字符串(例如:)生成 CSR 。我使用函数:CertStrToName()对其进行编码,一切正常,除了一件事:所有 OID 值都是用 ASN1 type 创建的PrintableString
。
有什么方法可以使 OID 1.2.300.38.22 类型为 1.2.300.38.22 NumericString
?
所以,我找到了两种方法来解决这个问题: 1. 以编程方式,使用函数CryptEncodeObject() 2. 我的密码提供程序支持一些特定的 oid,所以我可以将 CertStrToName 与它们一起使用,而无需接触代码。
Microsoft 的 CertStrToName() 方法不符合 RFC 4514。它不将#-encodings 视为AttributeValue-encodings,而是将它们视为要在OctetStrings 中编码的值。这意味着并非所有专有名称都可以从 CertStrToName 方法生成 - 特别是您的名称无法生成。
可分辨名称的字符串表示来自RFC 4514:可分辨名称的字符串表示。
在这里您可以看到,如果属性类型是点分十进制形式,您实际上应该将属性值编码为 a#
后跟 ASN.1 AttributeValue 的十六进制 BER 编码。IE:
2.5.4.3=姓氏,1.2.300.38.22=#12083132333435363738
您还可以阅读CertStrToName()的文档:
以数字符号 (#) 开头的值被视为 ASCII 十六进制并转换为 CERT_RDN_OCTET_STRING。嵌入的空白被忽略。例如,1.2.3 = # AB CD 01 与 1.2.3=#ABCD01 相同。