本文简要介绍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模块。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。