2017-12-20 9 views
5

Elasticsearch Searchguardの証明書を作成しようとしています。 1つの要件は、証明書に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(登録済みIDを意味する)であり、2番目のオクテット0x05は0x2A 0x03 0x04 0x05 0x05としてエンコードされた値の長さです。

BER符号化をこの値ので、それはKaliski文書にオブジェクト識別子の下でエンコーディングのセクションを見てデコードするために、オブジェクト識別子です。プリミティブ。

  1. 最初のオクテットは、値40 *の値1 +値2を有する:コンテンツのオクテットは 値1は、...、 完全なオブジェクト識別子の部品の整数値を表す値Nここで、以下の通りです。 value1は0,1,2の値に限定されているため、value2は であり、value1が0または1の場合は0〜39に制限され、 X.208によれば、nは常に2以上です。)

  2. 次のオクテットがあれば、値3、...、valuenをエンコードします。各値は可能な限り 桁の数字と、 を除いて各オクテットの最上位ビットが "1"に設定されたコード化された基底128、最上位桁からなります。

残りオクテットのすべてがそれらのmost-を持たない第1の値のオクテット0x2Aは小数42及び* 1 42 = 40 + 2であるので、OIDの最初の2つの成分は1と2であります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

関連する問題