2017-12-20 106 views
5

Próbuję utworzyć certyfikat dla Elasticsearch Searchguard. Jednym z wymogów jest to, że certyfikat musi zawierać oid:1.2.3.4.5.5 w sieciach SAN. Używam GO do wygenerowania tego certyfikatu. Po kilku próbach i błędach zorientowałem się, że jeśli użyję []byte{0x88, 0x05, 0x2A, 0x03, 0x04, 0x05, 0x05} jako Raw ASN.1 bytes, zmieni się to w oid:1.2.3.4.5.5 w SAN. Chcę zrozumieć, jak te bajty reprezentują wartość oid:1.2.3.4.5.5. Przeczytałem this, ale nadal jestem zdezorientowany. Czy możesz mi pomóc zrozumieć, jak ten bajt [] reprezentuje oid:1.2.3.4.5.5?Jak analizować DER bajtów?

Odpowiedz

5

Głównie dupe How does ASN.1 encode an object identifier?

kodowania wartości (X.509 = PKIX) św abonenta wewnętrznego jest zdefiniowane w rfc5280 jak:

SubjectAltName ::= GeneralNames 
GeneralNames ::= SEQUENCE SIZE (1..MAX) OF GeneralName 
GeneralName ::= CHOICE { // tags implicit 
    otherName     [0] AnotherName, 
    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 } 

ich wyboru, twój pierwszy oktet 0x88 jest wartość tag dla specyficznego dla kontekstu numeru 8 (oznaczającego registeredID), a drugi oktet 0x05 to długość wartości, która jest zakodowana jako 0x2A 0x03 0x04 0x05 0x05. Ponieważ ta wartość jest identyfikatorem obiektu, aby zdekodować wyglądać na odcinku o kodowaniu pod PRZEDMIOT identyfikator w dokumencie Kaliski:

kodowanie BER. Prymitywny. Zawartość oktetów jest następujący, wartosc1, ..., wartośćn oznaczają wartości całkowite składników w identyfikatorze pełnego obiektu:

  1. Pierwszy oktet ma wartość 40 * Value1 + wartość2. (Jest to jednoznaczne, ponieważ wartość 1 jest ograniczona do wartości 0, 1 i 2, wartość 2 to ograniczona do zakresu od 0 do 39, gdy wartość 1 wynosi 0 lub 1, a zgodnie z X.208, n wynosi zawsze co najmniej 2 .)

  2. Następujące oktety, jeśli istnieją, kodują wartość3, ..., wartość. Każda wartość jest kodowana jako podstawa 128, najważniejsza cyfra pierwsza, z jak najmniejszą liczbą cyfr , a najbardziej znaczący bit każdego oktetu oprócz jest ostatnim z zestawu kodowania wartości ustawionego na "1."

Wartość oktet pierwszy 0x2a jest dziesiętna 42 do 42 = 40 * 1 + 2, tak że pierwsze dwa składniki OID to 1 i 2. Każdy z pozostałych oktetów nie mają MOST znaczący zestaw bitów, więc każdy koduje jeden składnik: 3 4 5 5. OID składający się ze składników 1 2 3 4 5 5 jest w zwykłym tekście skrótowym 1.2.3.4.5.5 (ale istnieją inne równoważne zapisy, jak pokazano w Kaliski) .

Nawiasem mówiąc, ten OID jest nieważny, ponieważ musiałby on znajdować się w ramach instytucji członkowskiej kraju z kodem numerycznym ISO3166 i nie ma takiego kraju.

+0

Wielkie dzięki za wyjaśnienie @ dave_thompson_085! – codefx