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