本文簡要介紹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模塊。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。
