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