我有一个工作程序,它使用MS Crypto API从指定的SubjectDN字符串(例如:2.5.4.3=Name Surname, 1.2.300.38.22=12345678
)生成CSR。我使用函数CertStrToName()来对其进行编码,一切正常,除了一件事:所有OID值都是使用ASN1类型PrintableString
创建的。
有没有办法制作NumericString
类型的OID 1.2.300.38.22?
答案 0 :(得分:2)
所以,我找到了两种解决方法: 1.以编程方式,使用函数CryptEncodeObject() 2.我的cryptoprovider支持一些特定的oid,所以我可以使用CertStrToName,而无需触及代码。
答案 1 :(得分:2)
Microsoft的CertStrToName() - 方法不符合RFC 4514。它不将#-encodings视为AttributeValue编码,而是将它们视为要在OctetStrings中编码的值。这意味着并非所有Distruished Names都可以从CertStrToName方法生成 - 特别是您的生成无法生成。
专有名称的字符串表示形式来自RFC 4514: String Representation of Distinguished Names。
在这里你可以看到,如果属性类型是点分十进制形式,你实际上应该将属性值编码为#
,然后以ASN.1的十六进制编码BER编码的AttributeValue。即:
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。