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

412
Opa114

Я хочу добавить расширение Procuration в мой сертификат. Поэтому я использую инструмент XCA, который использует OpenSSL conf для создания сертификатов.

Это структура ASN1:

ProcurationSyntax ::= SEQUENCE { country [1] EXPLICIT PrintableString OPTIONAL typeOfSubstitution[2] EXPLICIT DirectoryString OPTIONAL signingFor [3] EXPLICIT SigningFor }  SigningFor ::= CHOICE { thirdPerson GeneralName certRef IssuerSerial }  IssuerSerial ::= SEQUENCE { issuer GeneralNames serial CertificateSerialNumber issuerUID UniqueIdentifier OPTIONAL } 

Теперь я хочу добавить это расширение как произвольное расширение через openssl conf ( https://www.openssl.org/docs/man1.1.0/apps/x509v3_config.html#ARBITRARY-EXTENSIONS )

Мой код выглядит так, но я застрял в остальном - материал третьего человека:

1.3.36.8.3.2=ASN1:SEQUENCE:proc_sect  [proc_sect] country=EXPLICIT:1,IA5STRING:EN typeOfSubtitution=EXPLICIT:2,IA5STRING:My Type of Substitution thirdPerson OR certRef=EXPLICIT:3,TODO 

Так что было бы очень полезно, если бы кто-то мог предоставить рабочий пример кода отсутствующего остатка, то есть thirdPerson и certRef.

2

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

3
grawity

Минимальный пример всего этого

1.3.36.8.3.2 = ASN1:SEQUENCE:procuration  [procuration] country = EXP:1, PRINTABLE:EN typeOfSubstitution = EXP:2, UTF8:My Type of Substitution thirdPerson = EXP:3, EXP:0, EXP:1, IA5:fred@example.com 

Чтобы получить тестовый пример, я скомпилировал следующую нотацию значений ASN.1, используя asn1-playstation :

procuration ProcurationSyntax ::= { country "EN", typeOfSubstitution utf8String : "My Type of Substitution", signingFor thirdPerson rfc822Name : "fred@example.com" } 

Я использовал эту схему .

[Proc]

Обратите внимание на различные типы строк.

countryопределяется как PrintableString (который является только подмножеством IA5String):

country = EXPLICIT:1, PRINTABLE:EN 

typeOfSubstitutionопределяется как DirectoryString, который представляет собой ВЫБОР между TeletexString, PrintableString, UniversalString, UTF8String или BMPString - некоторые из них являются подмножествами IA5String, другие являются надмножествами, но фактическая IA5String фактически не разрешена. Итак, давайте перейдем к UTF-8 Unicode:

; ┌── tag for ProcurationSyntax sequence ; ¦ typeOfSubstitution = EXPLICIT:2, UTF8:My Type of Substitution 

(Онлайн asn1step говорит, что нет отдельного тега для выбора DirectoryString; я полагаю, это потому, что все возможные варианты уже имеют уникальные «универсальные» теги.)

Поскольку signingForВЫБОР между thirdPersonпротив certRef, вы можете включить один или другой, и вам решать выбрать подходящий тип.

thirdPersonопределяется как [0] GeneralName, который представляет собой ВЫБОР между различными другими типами - точно такой же выбор, как и в расширении subjectAltName. Например, вы можете указать адрес электронной почты (в виде rfc822Name [1] IA5String):

; ┌── tag for ProcurationSyntax sequence ; │ ┌── tag for SigningFor choice ; │ │ ┌── tag for GeneralName choice ; ¦ ¦ ¦ thirdPerson = EXP:3, EXP:0, EXP:1, IA5:fred@example.com 

Или dNSName (определяется как [2] IA5String):

thirdPerson = EXP:3, EXP:0, EXP:2, IA5:example.com 

(Или другое имя, содержащее видео котенка в формате MPEG.)

Если вместо этого вы хотите выбрать certRef, это целая вложенная последовательность.

; ┌── tag for ProcurationSyntax sequence ; │ ┌── tag for SigningFor choice ; ¦ ¦ certRef = EXP:3, IMP:1, SEQUENCE:proc_certref 

[Proc_certref]

Внутри [proc_certref]раздела вы должны определить хотя бы issuerи serial.

issuerявляется GeneralNames, который является последовательностью значений GeneralName.

issuer = IMP:0, SEQUENCE:proc_certref_issuer ; └── tag for IssuerSerial sequence 

serialэто CertificateSerialNumber просто целое число.

serial = IMP:1, INTEGER:0x123456 

Примечание: я очень не уверен, должны ли они иметь неявные теги или нет.

[Proc_certref_issuer]

Отлично. Другой раздел, и GeneralNames на это. К счастью, есть только один из них. К сожалению, это более чем на ноль.

Простейшим допустимым значением будет одно GeneralName, которое является просто rfc822Name или dNSName (оба IA5String):

issuer.0 = IMP:1, IA5:fred@example.com ; └── tag for GeneralName choice 

... на самом деле, мы уже делали directoryName, не так ли? Поскольку это issuer.0GeneralName, он использует тот же формат, что и admissionAuthorityв вашем предыдущем расширении (с такими же тегами и всем остальным ), поэтому я не буду пытаться реализовать его здесь снова.

Большое спасибо за это очень подробное объяснение, которое мне очень помогает и проясняет некоторые моменты. Я посмотрю глубже в ближайшие дни. Opa114 6 лет назад 0
Я взглянул на это. Второй EXPLICIT не слишком много? `thirdPerson = EXP: 3, EXP: 0, EXP: 1, IA5: fred @ example.com`? Opa114 6 лет назад 0
Да, теги _might_ на самом деле не так. Я думаю, что это зависит от того, какой режим тегов по умолчанию использовался для всей схемы (ваш пост не содержит строку заголовка `DEFINITIONS [<...> TAGS] :: =`, так что это немного неоднозначно). grawity 6 лет назад 0
спасибо за подсказку Я буду искать это `ОПРЕДЕЛЕНИЯ` и отчет. Opa114 6 лет назад 0
спасибо за подсказку Я заглянул в CommonPKI-спецификацию и нашел следующую информацию: объекты CHOICE всегда помечены ЯВНЫМИ тегами, независимо от стандартного режима тегирования. Итак, ваш второй `EXPLICIT? правильно или? Но он не содержит информации, если тегами являются 0 и 1 или 1 и 2. Opa114 6 лет назад 0
Я считаю, что теги всегда начинаются с 0, если не указано иное. grawity 6 лет назад 0
а как насчет `CHOICE`Type. Если тег не указан, то по умолчанию используется режим тегов `EXPLICIT`? Но должен быть тег, иначе я не могу определить, какой это выбор, могу я? Opa114 6 лет назад 0
Я не уверен. Я бы сказал, что SigningFor находится на грани неоднозначности, поэтому, если бы я проектировал схему, я бы всегда добавлял явные теги ... (С другой стороны, в DirectoryString все возможные варианты уже имеют различные теги UNIVERSAL, поэтому дополнительные тегирование _apparently_ не нужно.) Это вне моего знания ASN.1. grawity 6 лет назад 0
Как я вижу, там режим по умолчанию Явный. Но теги `IMPLICIT` для serial, identifier и isserUID неверны, потому что в определении базовой структуры нет тегов, поэтому по умолчанию это будет EXPLICIT или я ошибаюсь? Opa114 6 лет назад 0

Похожие вопросы