当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Ruby ASN1模块用法及代码示例


本文简要介绍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 项的 tagtag_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-lang.org大神的英文原创作品 ASN1模块。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。