2017-12-20 16 views
5

Elasticsearch Searchguard에 대한 인증서를 만들려고합니다. 한 가지 요구 사항은 인증서에 SAN에 oid:1.2.3.4.5.5을 포함해야한다는 것입니다. 나는 그 인증서를 생성하기 위해 GO를 사용하고 있습니다. 몇 번의 시행 착오 끝에 []byte{0x88, 0x05, 0x2A, 0x03, 0x04, 0x05, 0x05}을 Raw ASN.1 바이트로 사용하면 SAN에서 oid:1.2.3.4.5.5이됩니다. 이 바이트가 oid:1.2.3.4.5.5 값을 나타내는 방식을 이해하고 싶습니다. 나는 this을 읽었지 만 나는 아직도 혼란 스럽다. 이 [] 바이트가 oid:1.2.3.4.5.5을 나타내는 방식을 이해하도록 도와 줄 수 있습니까?DER 바이트를 구문 분석하는 방법은 무엇입니까?

답변

5

구름 How does ASN.1 encode an object identifier?

제 (X.509 = PKIX) SAN 확장 값의 부호화 속는 된 바와 rfc5280 정의된다 : 이러한 선택을위한

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 } 

, 첫 번째 옥텟 0x88의 태그 값은 문맥에 따른 # 8 (의미는 registeredID)이고, 두 번째 옥텟 0x05는 0x2A 0x03 0x04 0x05 0x05로 인코딩 된 값의 길이입니다. 이 값이 객체 식별자이기 때문에,이 Kaliski 문서 객체 식별자에 따라 인코딩 섹션 보면 디코딩 :

BER 인코딩. 프리미티브.

  1. 첫번째 옥텟 값 40 *의 VALUE1 + 값 2를 갖는다 : 내용량 옥텟 VALUE1은 ... 상기 완전한 객체 식별자의 구성 요소의 정수 값을 나타내는 값 N 여기서, 다음과 같다. value1은 0, 1 및 2 값으로 제한되므로 value2는 이며 value1이 0 또는 1 일 때 0에서 39로 제한되고 X.208에 따라 n은 항상 2 이상입니다 (이 값은 명확하지 않습니다. .)

  2. 다음 옥텟 (있는 경우)은 값 3, ..., 값을 인코딩합니다. 각 값은 가능한 한 적은 숫자로 자릿수의 숫자와 함께 가장 중요한 숫자 128을 먼저 인코딩하고 을 제외하고 각 옥텟의 최상위 비트는 "1"로 설정됩니다.

0x2A 소수점 42 = 40 * 1 + 2 (42), 그래서 OID의 처음 두 성분이 1이며 2 나머지 옥텟 그들의 모든 most-없는 첫 번째 값 옥텟 3 4 5 5. 컴포넌트 1 2 3 4 5 5로 구성된 OID는 보통 속기 표기법 1.2.3.4.5.5로되어 있습니다 (그러나 Kaliski에서 볼 수있는 다른 동등한 표기법이 있습니다) .

덧붙여 말하자면 OID는 ISO3166 숫자 코드 3이있는 국가의 구성원 본문 아래 있어야하고 해당 국가가 없기 때문에 유효하지 않습니다.

+0

@ dave_thompson_085 설명에 감사드립니다! – codefx