Синтаксис допуска структуры ASN1

442
Opa114

Я хочу добавить расширение приема в мой сертификат. Поэтому я использую Инструмент 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 

Там теги не совпадали. Но не знаю почему. В определении синтаксиса допуска я должен пометить его как EPLICIT, но GERNERALNAME должен быть помечен как IMPLICIT, но я получил ошибку. так в чем проблема?

Следующая ошибка здесь:

professionItems=UTF8String:String1,UTF8String:String2 

PROFESSIONITEM - это ПОСЛЕДОВАТЕЛЬНОСТЬ DIRECTORYSTRING, но когда я прочитал в сертификате с BouncyCastle на Java, я получил исключение DERUTF8STRING, так что здесь я должен ошибиться, может быть, я определил его как ложное? надеюсь, кто-нибудь может помочь.

1
Do you have an example of a valid certificate? grawity 8 лет назад 0
нет :( если у кого-то есть, было бы неплохо :) Opa114 8 лет назад 0

1 ответ на вопрос

0
grawity

You can see the generated structure using tools such as dumpasn1 or openssl asn1parse -i.


I tried creating an example structure using the schema and an actual ASN.1 compiler.

  • The admissionAuthority, I think, only needs to be configured for explicit tagging. (I don't have the slightest idea about tags though.

    admissionAuthority = EXPLICIT:1, IA5STRING:MyGeneralName 

    Which seems to match the compiler output.

  • OpenSSL's "UTF8String:" extends until the end of the line. So what you have is one professionItem, with the value "String1,UTF8String:String2".

    Multiple values could be defined like this:

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

    But since they must be inside a SEQUENCE, you again need a separate section:

    professionItems = SEQUENCE:item_sect [item_sect] 0 = UTF8String:String1 1 = UTF8String:String2 
  • But, professionItems needs to be a SEQUENCE of professionInfo SEQ's. For a SEQ of just one item, the simplest option is:

    professionItems = SEQWRAP, SEQUENCE:item_sect 

    If you needed multiple items, you'd have to use another section:

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

I successfully reproduced your example in comments with:

[seq_sect] # GeneralName tag [4] is directoryName #admissionAuthority = EXPLICIT:1, IA5STRING:whatever@example.com #admissionAuthority = EXPLICIT:2, IA5STRING:example.com admissionAuthority = EXPLICIT:4, SEQUENCE:authority_name_sect #admissionAuthority = EXPLICIT:6, IA5STRING:https://www.example.com/ # this could be a "SEQWRAP, SEQUENCE:admission0_sect" # as long as there's only one admission item contentsOfAdmissions = SEQUENCE:admissions_sect [authority_name_sect] # this is a Name aka a RDNSequence... # each RelativeDistinguishedName generally only has one AttributeTypeAndValue # (multiple happen in LDAP but rarely), thus SETWRAP does the job here rdn.1 = SETWRAP, SEQUENCE:authority_dn_C_sect rdn.2 = SETWRAP, SEQUENCE:authority_dn_O_sect rdn.3 = SETWRAP, SEQUENCE:authority_dn_postal_sect [authority_dn_C_sect] oid = OID:2.5.4.6 value = PRINTABLESTRING:DE [authority_dn_O_sect] oid = OID:2.5.4.10 value = UTF8String:Firma A [authority_dn_postal_sect] oid = OID:2.5.4.16 value = SEQUENCE:authority_dn_postal_values [authority_dn_postal_values] 0 = UTF8String:Street 1 = UTF8String:PostalCode Adress 2 = UTF8String:DE [admissions_sect] admission.0 = SEQUENCE:admission0_sect [admission0_sect] professionInfos = SEQUENCE:professionInfos_sect [professionInfos_sect] professionInfo.0 = SEQUENCE:professionInfo0_sect [professionInfo0_sect] # namingAuthority = ... professionItems = SEQUENCE:professionItems_sect # professionOIDs = ... [professionItems_sect] professionItem.0 = UTF8String:Arzt/Ärztin 
я попробовал это, но та же ошибка, когда я анализирую это с BouncyCastle в Java. Это связано с UTF8String в профессиональных элементах. Opa114 8 лет назад 0
Хорошо, попробуйте преобразовать шестнадцатеричное содержимое в двоичный файл и передать его в asn1parse или dumpasn1. Сравните с вашими собственными сертификатами. grawity 8 лет назад 0
да, я знаю, и я сделал это, но я не вижу разницы между этим и моей версией выше. ты видел разницу? Opa114 8 лет назад 0
Хм, у меня проблемы даже с dumpasn1 интерпретировать это. Но даже из-за этого он, кажется, эквивалентен результату `admissionAuthority = EXPLICIT: 4, SEQUENCE: name_sect` без дополнительных причудливых тегов. Явный тег отмечает вариант GeneralName (в данном случае это directoryName), вот и все. grawity 8 лет назад 0
Завтра я посмотрю на это глубже и доложу. Спасибо! Opa114 8 лет назад 0
Ах, наконец-то понял (невидимый юникод мешает). Смотрите обновление для публикации. Куча пяти вложенных ПОСЛЕДОВАТЕЛЬНОСТЕЙ, которая происходит _afterwards_, все еще за пределами моего понимания. AdmissionSyntax даже не идет так глубоко. grawity 8 лет назад 0
Хорошо, _finally_ понял это. ✔ grawity 8 лет назад 0
это сработало как ожидалось. большое спасибо!! Теперь с вашим последним обновленным кодом я вижу, где мои ошибки. Opa114 8 лет назад 0