2

Я хочу добавить расширение 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.

1 ответ1

3

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .