我想将准入扩展添加到我的证书中。因此我使用工具 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
。
招生管理局我认为,只需要配置显式标记即可。(虽然我对标签一无所知。)
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