Я думаю, что это ошибка или ограничение pyasn1
Интересно, связано ли это с этим: https://github.com/etingof/pyasn1/issues/179
spe c говорит
GeneralName ::= CHOICE {
otherName [0] OtherName,
rfc822Name [1] IA5String,
dNSName [2] IA5String,
x400Address [3] ORAddress,
directoryName [4] Name,
ediPartyName [5] EDIPartyName,
uniformResourceIdentifier [6] IA5String,
iPAddress [7] OCTET STRING,
registeredID [8] OBJECT IDENTIFIER}
Name ::= CHOICE { -- only one possibility for now --
rdnSequence RDNSequence }
RDNSequence ::= SEQUENCE OF RelativeDistinguishedName
В ASN.1 обычно есть этап компиляции, который генерирует некоторый код. С pyasn1 вы либо пишете код самостоятельно, либо включаете некоторые модули.
Поскольку вы включаете pyasn1_modules.rfc2459 , единственная работа - использовать классы.
Ваше написание выглядит очень законно
>>> rdn_sequence = RDNSequence()
>>> rdn_sequence.append(rdn)
>>>
>>> name = Name()
>>> name[0] = rdn_sequence
>>>
>>> general_name = GeneralName()
>>> general_name['directoryName'] = name
Но кажется, что pyasn1 разрешает только сокращенный доступ
>>> rdn_sequence = RDNSequence()
>>> rdn_sequence.append(rdn)
>>>
>>> general_name = GeneralName()
>>> general_name['directoryName'][''] = rdn_sequence
Я думаю, что оба должны быть разрешены ...
Что касается тегов : поскольку вы используете модули pyasn1, вам не нужно беспокоиться о них. Они необходимы для кодирования сообщений, когда формой кодирования является Tag / Length / Value (правила кодирования BER, CER и DER ASN.1).
Что касается типов (например, UTF8String): вы можете ' Чтобы изменить их, они должны быть типами, которые вы прочитали из Спецификации ASN.1. С ними связан (так называемый универсальный) тег, и получатель не поймет ваше закодированное сообщение.
Обратите внимание, что между реализацией Name и spe c есть небольшое расхождение (spe c имеет именованный тип, а реализация не имеет имени). Это было позволено в старину.
class Name(univ.Choice):
componentType = namedtype.NamedTypes(
namedtype.NamedType('', RDNSequence())
)
Но я не думаю, что это проблема.