如何将ASN1 NumericString类型设置为SubjectDN OID?

时间:2012-08-13 18:50:04

标签: c++ encoding cryptography cryptoapi

我有一个工作程序,它使用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?

2 个答案:

答案 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。