2011-04-01 14 views
14

pyOpenSSL'nin bana '0\r\x82\x0bexample.com' verdiğini gösteren bazı verilerim var. Bu, subjectAltName X509 uzantısının değeri olmalıdır. Ben pyasn1 kullanarak bu uzantı için ASN1 şartname gerekli parçaları kodlamak için çalıştı (ve pyasn1 örneklerinden birine dayalı):pyasn1 kullanarak subjectAltName uzantı verilerini nasıl ayrıştırabilirim?

from pyasn1.type import univ, constraint, char, namedtype 

from pyasn1.codec.der.decoder import decode 

MAX = 64 

class DirectoryString(univ.Choice): 
    componentType = namedtype.NamedTypes(
     namedtype.NamedType(
      'teletexString', char.TeletexString().subtype(
       subtypeSpec=constraint.ValueSizeConstraint(1, MAX))), 
     namedtype.NamedType(
      'printableString', char.PrintableString().subtype(
       subtypeSpec=constraint.ValueSizeConstraint(1, MAX))), 
     namedtype.NamedType(
      'universalString', char.UniversalString().subtype(
       subtypeSpec=constraint.ValueSizeConstraint(1, MAX))), 
     namedtype.NamedType(
      'utf8String', char.UTF8String().subtype(
       subtypeSpec=constraint.ValueSizeConstraint(1, MAX))), 
     namedtype.NamedType(
      'bmpString', char.BMPString().subtype(
       subtypeSpec=constraint.ValueSizeConstraint(1, MAX))), 
     namedtype.NamedType(
      'ia5String', char.IA5String().subtype(
       subtypeSpec=constraint.ValueSizeConstraint(1, MAX))), 
     ) 


class AttributeValue(DirectoryString): 
    pass 


class AttributeType(univ.ObjectIdentifier): 
    pass 


class AttributeTypeAndValue(univ.Sequence): 
    componentType = namedtype.NamedTypes(
     namedtype.NamedType('type', AttributeType()), 
     namedtype.NamedType('value', AttributeValue()), 
     ) 


class RelativeDistinguishedName(univ.SetOf): 
    componentType = AttributeTypeAndValue() 

class RDNSequence(univ.SequenceOf): 
    componentType = RelativeDistinguishedName() 


class Name(univ.Choice): 
    componentType = namedtype.NamedTypes(
     namedtype.NamedType('', RDNSequence()), 
     ) 


class Extension(univ.Sequence): 
    componentType = namedtype.NamedTypes(
     namedtype.NamedType('extnID', univ.ObjectIdentifier()), 
     namedtype.DefaultedNamedType('critical', univ.Boolean('False')), 
     namedtype.NamedType('extnValue', univ.OctetString()), 
     ) 


class Extensions(univ.SequenceOf): 
    componentType = Extension() 
    sizeSpec = univ.SequenceOf.sizeSpec + constraint.ValueSizeConstraint(1, MAX) 


class GeneralName(univ.Choice): 
    componentType = namedtype.NamedTypes(
     # namedtype.NamedType('otherName', AnotherName()), 
     namedtype.NamedType('rfc822Name', char.IA5String()), 
     namedtype.NamedType('dNSName', char.IA5String()), 
     # namedtype.NamedType('x400Address', ORAddress()), 
     namedtype.NamedType('directoryName', Name()), 
     # namedtype.NamedType('ediPartyName', EDIPartyName()), 
     namedtype.NamedType('uniformResourceIdentifier', char.IA5String()), 
     namedtype.NamedType('iPAddress', univ.OctetString()), 
     namedtype.NamedType('registeredID', univ.ObjectIdentifier()), 
     ) 


class GeneralNames(univ.SequenceOf): 
    componentType = GeneralName() 
    sizeSpec = univ.SequenceOf.sizeSpec + constraint.ValueSizeConstraint(1, MAX) 


class SubjectAltName(GeneralNames): 
    pass 

print decode('0\r\x82\x0bexample.com', asn1Spec=GeneralNames()) 

Açıkçası ben sonuna yakın biraz sıkıldım ve tam belirtmedi GeneralName türü. Ancak, test dizesi atlanan değerlerden biri değil, bir dNSName içermelidir, bu yüzden umurumda değil.

Traceback (most recent call last): 
    File "x509.py", line 94, in <module> 
    print decode('0\r\x82\x0bexample.com', asn1Spec=GeneralNames()) 
    File "/usr/lib/pymodules/python2.6/pyasn1/v1/codec/ber/decoder.py", line 493, in __call__ 
    length, stGetValueDecoder, decodeFun 
    File "/usr/lib/pymodules/python2.6/pyasn1/v1/codec/ber/decoder.py", line 202, in valueDecoder 
    substrate, asn1Spec 
    File "/usr/lib/pymodules/python2.6/pyasn1/v1/codec/ber/decoder.py", line 453, in __call__ 
    __chosenSpec.getTypeMap().has_key(tagSet): 
    File "/usr/lib/pymodules/python2.6/pyasn1/v1/type/univ.py", line 608, in getTypeMap 
    return Set.getComponentTypeMap(self) 
    File "/usr/lib/pymodules/python2.6/pyasn1/v1/type/univ.py", line 535, in getComponentTypeMap 
    def getComponentTypeMap(self): return self._componentType.getTypeMap(1) 
    File "/usr/lib/pymodules/python2.6/pyasn1/v1/type/namedtype.py", line 126, in getTypeMap 
    'Duplicate type %s in map %s'%(k,self.__typeMap) 
pyasn1.error.PyAsn1Error: Duplicate type TagSet(Tag(tagClass=0, tagFormat=0, tagId=22)) in map {TagSet(Tag(tagClass=0, tagFormat=0, tagId=22)): IA5String()} 

nerede yanlış herhangi bir ipucu ve başarıyla ayrıştırmak nasıl pyasn1 ile bu uzatma tipi çok olacaktır: Program çalıştırıldığında

, ben yorumlamak mümkün değilim bir hata ile sonlandı takdir.

cevap

15

Bu soruyu pyasn1 kullanıcıları listesine ekledim ve Ilya Etingof (pyasn1'in yazarı) hatamı işaret etti. Özetle, GeneralName.componentType numaralı telefondan NamedType etiket bilgilerinin verilmesi gerekir. Bu, subtype yöntemiyle yapılır. Yerine Örnek:

namedtype.NamedType('rfc822Name', char.IA5String()), 

tanımı olmalıdır: Bir etiketi tanımladıktan sonra

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 
} 

: 1GeneralName ASN.1 tanımından geliyor

namedtype.NamedType('rfc822Name', char.IA5String().subtype(
     implicitTag=tag.Tag(tag.tagClassContext, 
          tag.tagFormatSimple, 1))), 

componentType'un bu alanlarının her biri için ayrıştırma başarılı:

(GeneralNames().setComponentByPosition(
    0, GeneralName().setComponentByPosition(1, IA5String('example.com'))), '')