2017-12-20 97 views
5

Tôi đang cố gắng tạo chứng chỉ cho Elasticsearch Searchguard. Một yêu cầu là chứng chỉ phải bao gồm oid:1.2.3.4.5.5 trong SAN. Tôi đang sử dụng GO để tạo ra chứng chỉ đó. Sau khi một số thử nghiệm và lỗi tôi đã tìm ra rằng nếu tôi sử dụng []byte{0x88, 0x05, 0x2A, 0x03, 0x04, 0x05, 0x05} như Raw ASN.1 byte, điều này biến thành oid:1.2.3.4.5.5 trong SAN. Tôi muốn hiểu cách các byte này đại diện cho giá trị oid:1.2.3.4.5.5. Tôi đã đọc this, nhưng tôi vẫn còn bối rối. Bạn có thể giúp tôi hiểu cách [] byte này đại diện cho oid:1.2.3.4.5.5 không?Làm cách nào để phân tích cú pháp DER byte?

Trả lời

5

Chủ yếu là lừa How does ASN.1 encode an object identifier?

Mã hóa các giá trị (X.509 = PKIX) SAN mở rộng được định nghĩa trong rfc5280 như:

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 } 

Đối với sự lựa chọn này, octet đầu tiên của bạn 0x88 là giá trị thẻ cho ngữ cảnh cụ thể # 8 (có nghĩa là đã đăng kýID) và octet thứ hai 0x05 là độ dài của giá trị, được mã hóa là 0x2A 0x03 0x04 0x05 0x05. Vì giá trị này là một mã định danh đối tượng, để giải mã nó nhìn vào phần mã hóa dưới OBJECT IDENTIFIER trong tài liệu Kaliski:

Mã hóa BER. Nguyên thủy. Nội dung octet như sau, nơi value1, ..., valueN biểu thị các giá trị số nguyên của các thành phần trong định danh hoàn chỉnh đối tượng:

  1. Octet đầu tiên có giá trị 40 * value1 + value2. (Điều này rõ ràng, vì giá trị 1 được giới hạn ở các giá trị 0, 1 và 2; giá trị 2 là giới hạn trong phạm vi từ 0 đến 39 khi giá trị 1 là 0 hoặc 1; và theo X.208, n luôn là ít nhất 2 .)

  2. Các octet sau, nếu có, mã hóa giá trị3, ..., valuen. Mỗi giá trị được mã hóa cơ sở 128, chữ số quan trọng đầu tiên, với ít nhất là chữ số càng tốt và bit quan trọng nhất của mỗi octet ngoại trừ cuối cùng trong mã hóa giá trị được đặt thành "1."

Octet giá trị đầu tiên 0x2A là số thập phân 42 và 42 = 40 * 1 + 2, do hai thành phần đầu tiên của OID là 1 và 2. Tất cả các octet còn lại không có most- của họ bộ bit quan trọng để mỗi mã hóa một thành phần: 3 4 5 5. OID bao gồm các thành phần 1 2 3 4 5 5 là ký pháp viết tắt thông thường 1.2.3.4.5.5 (nhưng có các ký hiệu tương đương khác như được hiển thị trong Kaliski) .

Ngẫu nhiên, OID đó không hợp lệ vì nó phải thuộc cơ quan thành viên của quốc gia có ISO3166 mã số 3 và không có quốc gia nào như vậy.

+0

Cảm ơn bạn rất nhiều vì đã giải thích @ dave_thompson_085! – codefx

Các vấn đề liên quan