ASN1 结构准入语法

ASN1 结构准入语法

我想将准入扩展添加到我的证书中。因此我使用工具 XCA,它使用 OpenSSL 来创建证书。

这是我用一些虚拟数据编写的结构:

1.3.36.8.3.3=ASN1:SEQUENCE:seq_sect

[seq_sect]
admissionAuthority=IMPLICIT:1,IA5STRING:MyGeneralName
contentsOfAdmissions=SEQUENCE:admissions_sect

[admissions_sect]
admissionAuthority=EXPLICIT:0,IMPLICIT:1,IA5STRING:MyGeneralNameAdmission
namingAuthority=EXPLICIT:1,SEQUENCE:namingAuthorithy_sect
professionInfos=SEQUENCE:professionInfo_sect

[professionInfo_sect]
namingAuthority=EXPLICIT:0,SEQUENCE:namingAuthorithy_sect
professionItems=UTF8String:String1,UTF8String:String2
professionOIDs=SEQUENCE:oid_sect
registrationNumber=PRINTABLESTRING:registrationNumber
addProfessionInfo=OCTETSTRING:ProffessionInfo

[oid_sect]
one=OID:1.2.3.4
two=OID:1.2.3.5

[namingAuthorithy_sect]
namingAuthorityId=OID:1.2.3.4
namingAuthorityUrl=IA5STRING:http://www.url.de
namingAuthorithyText=UTF8String:namingAuthorityTEXT

但这是不对的。我遇到的第一个错误是:

admissionAuthority=EXPLICIT:0, IMPLICIT:1,IA5STRING:MyGeneralNameAdmission

那里的标记不匹配。但不知道为什么。在 Admission Syntax 的定义中,我必须将其标记为 EPLICIT,但 GERNERALNAME 必须标记为 IMPLICIT,但我收到错误。那么问题出在哪里?

下一个错误在这里:

professionItems=UTF8String:String1,UTF8String:String2

PROFESSIONITEM 是 DIRECTORYSTRING 的序列,但是当我使用 Java 中的 BouncyCastle 读取证书时,出现了 DERUTF8STRING 异常,所以这里一定是我的错误,也许我将其定义为错误的?希望有人能帮忙。

答案1

dumpasn1您可以使用或等工具查看生成的结构openssl asn1parse -i


我尝试使用创建示例结构架构以及实际的ASN.1 编译器

  • 招生管理局我认为,只需要配置显式标记即可。(虽然我对标签一无所知。)

    admissionAuthority = EXPLICIT:1, IA5STRING:MyGeneralName
    

    这似乎与编译器的输出相匹配。

  • OpenSSL 的“UTF8String:”会一直延伸到行尾。因此,您得到的是professionalItem,值为“ String1,UTF8String:String2”。

    可以像这样定义多个值:

    professionItems.0 = UTF8String:String1
    professionItems.1 = UTF8String:String2
    

    但由于它们必须位于 SEQUENCE 内,因此您再次需要一个单独的部分:

    professionItems = SEQUENCE:item_sect
    
    [item_sect]
    0 = UTF8String:String1
    1 = UTF8String:String2
    
  • 但是,professionItems 需要是一个 SEQUENCE职业信息 SEQ。对于只有一个项目的 SEQ,最简单的选项是:

    professionItems = SEQWRAP, SEQUENCE:item_sect
    

    如果您需要多个项目,则必须使用另一个部分:

    professionItems = SEQUENCE:prof_items_sect
    
    [prof_items_sect]
    0 = SEQUENCE:item0_sect
    1 = SEQUENCE:item1_sect
    ...
    

我在评论中成功复现了您的示例:

[序列号]
# GeneralName 标签 [4] 是 directoryName
#admissionAuthority = EXPLICIT:1,IA5STRING:[电子邮件保护]
#admissionAuthority = EXPLICIT:2, IA5STRING:example.com
入场权限 = EXPLICIT:4,序列:authority_name_sect
#admissionAuthority = EXPLICIT:6, IA5STRING:https://www.example.com/
# 这可能是“SEQWRAP,SEQUENCE:admission0_sect”
# 只要只有一个入场物品
入学内容 = SEQUENCE:入学科

    [authority_name_sect]
    # 这是一个名称,又名 RDNSequence……
    # 每个 RelativeDistinguishedName 通常只有一个 AttributeTypeAndValue
    #(LDAP 中会出现多次这种情况,但很少见),因此 SETWRAP 在这里完成这项工作
    rdn.1 = SETWRAP,序列:authority_dn_C_sect
    rdn.2 = SETWRAP,序列:authority_dn_O_sect
    rdn.3 = SETWRAP,序列:authority_dn_postal_sect

        [authority_dn_C_sect]
        oid = OID:2.5.4.6
        值 = PRINTABLESTRING:DE

        [authority_dn_O_sect]
        oid = OID:2.5.4.10
        值 = UTF8String:Firma A

        [authority_dn_postal_sect]
        oid = OID:2.5.4.16
        值 = SEQUENCE:authority_dn_postal_values

            [authority_dn_postal_values]
            0 = UTF8String:街道
            1 = UTF8String:邮政编码地址
            2 = UTF8字符串:DE

    [招生部门]
    入场.0 = SEQUENCE:入场0_sect

        [admission0_sect]
        职业信息 = SEQUENCE:职业信息_sect

            [职业信息_部分]
            职业信息.0 = SEQUENCE:职业信息0_sect

                [professionInfo0_sect]
                # 命名权限 = ...
                职业项目 = SEQUENCE:职业项目_sect
                # 职业OID = ...

                    [professionItems_sect]
                    professionalItem.0 = UTF8String:Arzt/Ärztin

相关内容