本文簡要介紹ruby語言中 OpenSSL::ASN1模塊
的用法。
抽象語法符號一(或 ASN.1)是一種用於說明數據結構的符號語法,在ITU-T X.680 中定義。 ASN.1 本身不要求任何編碼或解析規則,但通常 ASN.1 數據結構使用 Distinguished Encoding
規則 (DER) 或較少使用 ITU-T X 中說明的基本 Encoding
規則 (BER) 進行編碼.690。 DER 和 BER 編碼是二進製 Tag-Length-Value (TLV) 編碼,與 XML、 JSON
等其他流行的數據說明格式相比非常簡潔。ASN.1 數據結構在密碼應用程序中非常常見,例如X.509 公鑰證書或證書撤銷列表 (CRL) 都在 ASN.1 和 DER-encoded 中定義。 ASN.1、DER 和 BER 是應用密碼學的構建塊。 ASN1
模塊提供了允許生成 ASN.1 數據結構的必要類以及使用 DER 編碼對其進行編碼的方法。 decode 方法允許將任意 BER-/DER-encoded 數據解析為 Ruby 對象,然後可以隨意修改和重新編碼。
ASN.1 類層次結構
表示 ASN.1 結構的基類是 ASN1Data
。 ASN1Data
提供讀取和設置特定 ASN.1 項的 tag
、 tag_class
以及最後的 value
的屬性。解析時,任何標記值(隱式或顯式)都將由 ASN1Data
實例表示,因為它們的 “real type” 隻能使用 ASN.1 類型聲明中的帶外信息來確定。由於在編碼類型時通常已知此信息,因此 ASN1Data
的所有子類都提供附加屬性 tagging
,允許隱式 ( :IMPLICIT
) 或顯式 ( :EXPLICIT
) 編碼值。
Constructive
顧名思義, Constructive
是所有構造編碼的基類,即由多個值組成的編碼,與隻有一個值的 “primitive” 編碼相反。 Constructive
的值始終是 Array
。
ASN1::Set
和 ASN1::Sequence
最常見的構造編碼是 SET 和 SEQUENCE,這就是為什麽有兩個 Constructive
的子類代表它們中的每一個。
Primitive
這是所有原始值的超類。 Primitive
本身在解析 ASN.1 數據時不使用,所有值或者是 Primitive
的相應 sub-class 的實例,或者是 ASN1Data
的實例,如果該值被隱式或顯式標記。請參考。 Primitive
文檔,了解有關子類及其從 ASN.1 數據類型到 Ruby 對象的映射的詳細信息。
tagging
的可能值
在構造 ASN1Data
對象時,ASN.1 類型定義可能需要隱式或顯式標記某些元素。這可以通過為 ASN1Data
的子類手動設置 tagging
屬性來實現。使用符號:IMPLICIT
進行隱式標記,如果元素需要顯式標記,則使用:EXPLICIT
。
tag_class
的可能值
可以創建任意的 ASN1Data
對象,這些對象也支持 PRIVATE 或 APPLICATION 標記類。 tag_class
屬性的可能值為:
-
:UNIVERSAL
(未標記值的默認值) -
:CONTEXT_SPECIFIC
(標記值的默認值) -
:APPLICATION
-
:PRIVATE
標記常量
每個通用標簽都定義了一個常量:
-
OpenSSL::ASN1::EOC (0)
-
OpenSSL::ASN1::BOOLEAN (1)
-
OpenSSL::ASN1::整數 (2)
-
OpenSSL::ASN1::BIT_STRING (3)
-
OpenSSL::ASN1::OCTET_STRING (4)
-
OpenSSL::ASN1::NULL (5)
-
OpenSSL::ASN1::OBJECT (6)
-
OpenSSL::ASN1::枚舉 (10)
-
OpenSSL::ASN1::UTF8STRING (12)
-
OpenSSL::ASN1::SEQUENCE (16)
-
OpenSSL::ASN1::SET (17)
-
OpenSSL::ASN1::NUMERICSTRING (18)
-
OpenSSL::ASN1::PRINTABLESTRING (19)
-
OpenSSL::ASN1::T61STRING (20)
-
OpenSSL::ASN1::VIDEOTEXSTRING (21)
-
OpenSSL::ASN1::IA5STRING (22)
-
OpenSSL::ASN1::UTCTIME (23)
-
OpenSSL::ASN1::GENERALIZEDTIME (24)
-
OpenSSL::ASN1::圖形字符串 (25)
-
OpenSSL::ASN1::ISO64STRING (26)
-
OpenSSL::ASN1::GENERALSTRING (27)
-
OpenSSL::ASN1::UNIVERSALSTRING (28)
-
OpenSSL::ASN1::BMPSTRING (30)
UNIVERSAL_TAG_NAME
常數
Array
存儲給定標簽號的名稱。這些名稱與另外定義的標簽常量的名稱相同,例如+ UNIVERSAL_TAG_NAME = “INTEGER”+ 和 +OpenSSL::ASN1::INTEGER = 2+。
示例用法
解碼和查看 DER-encoded 文件
require 'openssl'
require 'pp'
der = File.binread('data.der')
asn1 = OpenSSL::ASN1.decode(der)
pp der
創建一個 ASN.1 結構並 DER-encoding 它
require 'openssl'
version = OpenSSL::ASN1::Integer.new(1)
# Explicitly 0-tagged implies context-specific tag class
serial = OpenSSL::ASN1::Integer.new(12345, 0, :EXPLICIT, :CONTEXT_SPECIFIC)
name = OpenSSL::ASN1::PrintableString.new('Data 1')
sequence = OpenSSL::ASN1::Sequence.new( [ version, serial, name ] )
der = sequence.to_der
相關用法
- Ruby ASN1Data.new用法及代碼示例
- Ruby ASN1.decode_all用法及代碼示例
- Ruby ASN1.decode用法及代碼示例
- Ruby ASN1.traverse用法及代碼示例
- Ruby ASN1Data類用法及代碼示例
- Ruby Array.push用法及代碼示例
- Ruby Array.hash用法及代碼示例
- Ruby ARGF.path用法及代碼示例
- Ruby Addrinfo.ip_address用法及代碼示例
- Ruby Array permutation()用法及代碼示例
- Ruby Array.to_a用法及代碼示例
- Ruby Array.to_h用法及代碼示例
- Ruby Array.to_s用法及代碼示例
- Ruby Array class fill()用法及代碼示例
- Ruby Array.array + other_array用法及代碼示例
- Ruby Array product()用法及代碼示例
- Ruby Array zip()用法及代碼示例
- Ruby Array concat()用法及代碼示例
- Ruby Array類用法及代碼示例
- Ruby Addrinfo.connect_from用法及代碼示例
- Ruby Array.take()用法及代碼示例
- Ruby Array.reject!用法及代碼示例
- Ruby Array.flatten!用法及代碼示例
- Ruby Array.reject用法及代碼示例
- Ruby Array compact!()用法及代碼示例
注:本文由純淨天空篩選整理自ruby-lang.org大神的英文原創作品 ASN1模塊。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。