Минимальный пример всего этого
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.0
GeneralName, он использует тот же формат, что и admissionAuthority
в вашем предыдущем расширении (с такими же тегами и всем остальным ), поэтому я не буду пытаться реализовать его здесь снова.