ASN.1(Abstract Syntax Notation One) のデータを取り扱うためのモジュールです。
OpenSSLで証明書などを取り扱うのに必要になります。
このモジュールには、ASN.1関連のモジュール関数や定数、 ASN.1 のデータ型に対応するクラスが定義されています。
このモジュールは ASN.1 を十分に取り扱うのに必要な機能は持っていません。SSL/TLSで必要な機能しか実装されていません。
ASN.1 は ITU-T と ISO によって定義された、データの構造を定義するための言語を中心とした規格です。この言語で定義された抽象的な構造を実際のバイト列で表現する方法は ASN.1 の規格の一部として数種類定義されています。このリファレンスで言及されている DER 形式もこのエンコード形式の一種です。
このモジュールにおいて、 ASN.1 のデータ型は OpenSSL::ASN1::ASN1Data およびそのサブクラスにマップされています。
ASN.1 の単純型(simple type)は OpenSSL::ASN1::Primitive の各サブクラスに、構造型(structured type)は OpenSSL::ASN1::Constructive の各サブクラスに対応しています。通常これらのタグクラスは UNIVERSAL です。その値は OpenSSL::ASN1::ASN1Data#value で取り出せます。単純型は通常の Ruby のオブジェクト、構造型は配列 UNIVERSAL以外のタグクラスを付けられた型は、 OpenSSL::ASN1::ASN1Data に対応します。UNIVERSAL以外のタグクラスでタグ付けられた型のデータは、OpenSSL::ASN1::ASN1Dataのオブジェクトで表現され、その値として文字列(IMPLICITなタグ付けの場合)もしくは配列(EXPLICITなタグ付けの場合)として表現されます。 OpenSSL::ASN1::Primitive のタグ付けの情報を使うことで、 IMPLICIT or EXPLICIT なタグ付けを実現することもできます。
例:
require 'openssl' # 単純型のデータ x = OpenSSL::ASN1::UTF8String.new("foobar") # 構造型のデータ y = OpenSSL::ASN1::Sequence.new([OpenSSL::ASN1::Boolean.new(true), OpenSSL::ASN1::Integer.new(-12)]) # APPLICATION タグクラスのタグ2番でタグ付けられたデータ z = OpenSSL::ASN1::ASN1Data.new([OpenSSL::ASN1::Boolean.new(false)], 2, :APPLICATION) # 上と同様のデータを OpenSSL::ASN1::Boolean.new の2番目以降の # 引数で表現する z2 = OpenSSL::ASN1::Boolean.new(false, 2, :EXPLICIT, :APPLICATION) # IMPLICIT なタグ付けをする u = OpenSSL::ASN1::Boolean.new(false, 3, :IMPLICIT, :APPLICATION) # to_der でエンコード x.to_der # => "\f\x06foobar" y.to_der # => "0\x06\x01\x01\xFF\x02\x01\xF4" z.to_der # => "b\x03\x01\x01\x00" z2.to_der # => "b\x03\x01\x01\x00" これは z.to_der と同じ u.to_der # => "C\x01\x00" # エンコードした文字列をデコード OpenSSL::ASN1.decode(x.to_der) # => #<OpenSSL::ASN1::UTF8String:0x000000027cc700 @tag=12, @value="foobar", @tagging=nil, @tag_class=:UNIVERSAL> OpenSSL::ASN1.decode(y.to_der) # => #<OpenSSL::ASN1::Sequence:0x000000027c47d0 @tag=16, @value=[#<OpenSSL::ASN1::Boolean:0x000000027c4898 @tag=1, @value=true, @tagging=nil, @tag_class=:UNIVERSAL>, #<OpenSSL::ASN1::Integer:0x000000027c47f8 @tag=2, @value=-12, @tagging=nil, @tag_class=:UNIVERSAL>], @tagging=nil, @tag_class=:UNIVERSAL> OpenSSL::ASN1.decode(z.to_der) # => #<OpenSSL::ASN1::ASN1Data:0x000000027bc918 @tag=2, @value=[#<OpenSSL::ASN1::Boolean:0x000000027bc968 @tag=1, @value=false, @tagging=nil, @tag_class=:UNIVERSAL>], @tag_class=:APPLICATION> OpenSSL::ASN1.decode(u.to_der) # => #<OpenSSL::ASN1::ASN1Data:0x000000025bef30 @tag=3, @value="\x00", @tag_class=:APPLICATION> # @valueが "\x00" という文字列になっている
このモジュールは ASN.1 記法による記述を解釈し、利用する機能はないため、 IMPLICITなタグ付けをされたデータを適切に取り扱うことは面倒でしょう。
DER形式の文字列をデコードしてRubyのオブジェクトに変換するには OpenSSL::ASN1.#decode もしくは OpenSSL::ASN1.#decode_all を用います。逆に、OpenSSL::ASN1::ASN1Data のオブジェクトを DER 形式の文字列に変換するには、OpenSSL::ASN1::ASN1Data#to_derを用います。
クラス階層
OpenSSL::ASN1::ASN1Data +-> OpenSSL::ASN1::Primitive | +-> OpenSSL::ASN1::Boolean | +-> OpenSSL::ASN1::Integer | +-> OpenSSL::ASN1::Enumerated | +-> OpenSSL::ASN1::BitString | +-> OpenSSL::ASN1::OctetString | +-> OpenSSL::ASN1::UTF8String | +-> OpenSSL::ASN1::NumericString | +-> OpenSSL::ASN1::PrintableString | +-> OpenSSL::ASN1::T61String | +-> OpenSSL::ASN1::VideotexString | +-> OpenSSL::ASN1::IA5String | +-> OpenSSL::ASN1::GraphicString | +-> OpenSSL::ASN1::ISO64String | +-> OpenSSL::ASN1::GeneralString | +-> OpenSSL::ASN1::UniversalString | +-> OpenSSL::ASN1::BMPString | +-> OpenSSL::ASN1::Null | +-> OpenSSL::ASN1::ObjectId | +-> OpenSSL::ASN1::UTCTime | `-> OpenSSL::ASN1::GeneralizedTime `-> OpenSSL::ASN1::Constructive +-> OpenSSL::ASN1::Set `-> OpenSSL::ASN1::Sequence
BMPString(value) -> OpenSSL::ASN1::BMPString -> OpenSSL::ASN1::BMPString
[permalink][rdoc]BMPString(value, tag, tagging, tag_class) -> OpenSSL::ASN1::BMPString
ASN.1 の BMPString 型の値を表現する Ruby のオブジェクトを生成します。
OpenSSL::ASN1::BMPString.new と同じです。
BitString(value) -> OpenSSL::ASN1::BitString -> OpenSSL::ASN1::BitString
[permalink][rdoc]BitString(value, tag, tagging, tag_class) -> OpenSSL::ASN1::BitString
ASN.1 の BitString 型の値を表現する Ruby のオブジェクトを生成します。
OpenSSL::ASN1::BitString.new と同じです。
Boolean(value) -> OpenSSL::ASN1::Boolean
[permalink][rdoc]Boolean(value , tag , tagging , tag_class) -> OpenSSL::ASN1::Boolean
ASN.1 の Boolean 型の値を表現する OpenSSL::ASN1::Boolean オブジェクトを生成します。
OpenSSL::ASN::Boolean.new と同じです。
Enumerated(value) -> OpenSSL::ASN1::Enumerated
[permalink][rdoc]Enumerated(value, tag, tagging, tag_class) -> OpenSSL::ASN1::Enumerated
ASN.1 の Enumerated 型の値を表現する Ruby のオブジェクトを生成します。
OpenSSL::ASN1::Enumerated.new と同じです。
GeneralString(value) -> OpenSSL::ASN1::GeneralString -> OpenSSL::ASN1::GeneralString
[permalink][rdoc]GeneralString(value, tag, tagging, tag_class) -> OpenSSL::ASN1::GeneralString
ASN.1 の GeneralString 型の値を表現する Ruby のオブジェクトを生成します。
OpenSSL::ASN1::GeneralString.new と同じです。
GeneralizedTime(value) -> OpenSSL::ASN1::GeneralizedTime -> OpenSSL::ASN1::GeneralizedTime
[permalink][rdoc]GeneralizedTime(value, tag, tagging, tag_class) -> OpenSSL::ASN1::GeneralizedTime
ASN.1 の GeneralizedTime 型の値を表現する Ruby のオブジェクトを生成します。
OpenSSL::ASN1::GeneralizedTime.new と同じです。
GraphicString(value) -> OpenSSL::ASN1::GraphicString -> OpenSSL::ASN1::GraphicString
[permalink][rdoc]GraphicString(value, tag, tagging, tag_class) -> OpenSSL::ASN1::GraphicString
ASN.1 の GraphicString 型の値を表現する Ruby のオブジェクトを生成します。
OpenSSL::ASN1::GraphicString.new と同じです。
IA5String(value) -> OpenSSL::ASN1::IA5String -> OpenSSL::ASN1::IA5String
[permalink][rdoc]IA5String(value, tag, tagging, tag_class) -> OpenSSL::ASN1::IA5String
ASN.1 の IA5String 型の値を表現する Ruby のオブジェクトを生成します。
OpenSSL::ASN1::IA5String.new と同じです。
ISO64String(value) -> OpenSSL::ASN1::ISO64String -> OpenSSL::ASN1::ISO64String
[permalink][rdoc]ISO64String(value, tag, tagging, tag_class) -> OpenSSL::ASN1::ISO64String
ASN.1 の ISO64String 型の値を表現する Ruby のオブジェクトを生成します。
OpenSSL::ASN1::ISO64String.new と同じです。
Integer(value) -> OpenSSL::ASN1::Integer
[permalink][rdoc]Integer(value, tag, tagging, tag_class) -> OpenSSL::ASN1::Integer
ASN.1 の Integer 型の値を表現する Ruby のオブジェクトを生成します。
OpenSSL::ASN1::Integer.new と同じです。
Null(value) -> OpenSSL::ASN1::Null -> OpenSSL::ASN1::Null
[permalink][rdoc]Null(value, tag, tagging, tag_class) -> OpenSSL::ASN1::Null
ASN.1 の Null 型の値を表現する Ruby のオブジェクトを生成します。
OpenSSL::ASN1::Null.new と同じです。
NumericString(value) -> OpenSSL::ASN1::NumericString -> OpenSSL::ASN1::NumericString
[permalink][rdoc]NumericString(value, tag, tagging, tag_class) -> OpenSSL::ASN1::NumericString
ASN.1 の NumericString 型の値を表現する Ruby のオブジェクトを生成します。
OpenSSL::ASN1::NumericString.new と同じです。
ObjectId(value) -> OpenSSL::ASN1::ObjectId -> OpenSSL::ASN1::ObjectId
[permalink][rdoc]ObjectId(value, tag, tagging, tag_class) -> OpenSSL::ASN1::ObjectId
ASN.1 の ObjectId 型の値を表現する Ruby のオブジェクトを生成します。
OpenSSL::ASN1::ObjectId.new と同じです。
OctetString(value) -> OpenSSL::ASN1::OctetString -> OpenSSL::ASN1::OctetString
[permalink][rdoc]OctetString(value, tag, tagging, tag_class) -> OpenSSL::ASN1::OctetString
ASN.1 の OctetString 型の値を表現する Ruby のオブジェクトを生成します。
OpenSSL::ASN1::OctetString.new と同じです。
PrintableString(value) -> OpenSSL::ASN1::PrintableString -> OpenSSL::ASN1::PrintableString
[permalink][rdoc]PrintableString(value, tag, tagging, tag_class) -> OpenSSL::ASN1::PrintableString
ASN.1 の PrintableString 型の値を表現する Ruby のオブジェクトを生成します。
OpenSSL::ASN1::PrintableString.new と同じです。
Sequence(value) -> OpenSSL::ASN1::Sequence -> OpenSSL::ASN1::Sequence
[permalink][rdoc]Sequence(value, tag, tagging, tag_class) -> OpenSSL::ASN1::Sequence
ASN.1 の Sequence 型の値を表現する Ruby のオブジェクトを生成します。
OpenSSL::ASN1::Sequence.new と同じです。
Set(value) -> OpenSSL::ASN1::Set -> OpenSSL::ASN1::Set
[permalink][rdoc]Set(value, tag, tagging, tag_class) -> OpenSSL::ASN1::Set
ASN.1 の Set 型の値を表現する Ruby のオブジェクトを生成します。
OpenSSL::ASN1::Set.new と同じです。
T61String(value) -> OpenSSL::ASN1::T61String -> OpenSSL::ASN1::T61String
[permalink][rdoc]T61String(value, tag, tagging, tag_class) -> OpenSSL::ASN1::T61String
ASN.1 の T61String 型の値を表現する Ruby のオブジェクトを生成します。
OpenSSL::ASN1::T61String.new と同じです。
UTCTime(value) -> OpenSSL::ASN1::UTCTime -> OpenSSL::ASN1::UTCTime
[permalink][rdoc]UTCTime(value, tag, tagging, tag_class) -> OpenSSL::ASN1::UTCTime
ASN.1 の UTCTime 型の値を表現する Ruby のオブジェクトを生成します。
OpenSSL::ASN1::UTCTime.new と同じです。
UTF8String(value) -> OpenSSL::ASN1::UTF8String -> OpenSSL::ASN1::UTF8String
[permalink][rdoc]UTF8String(value, tag, tagging, tag_class) -> OpenSSL::ASN1::UTF8String
ASN.1 の UTF8String 型の値を表現する Ruby のオブジェクトを生成します。
OpenSSL::ASN1::UTF8String.new と同じです。
UniversalString(value) -> OpenSSL::ASN1::UniversalString -> OpenSSL::ASN1::UniversalString
[permalink][rdoc]UniversalString(value, tag, tagging, tag_class) -> OpenSSL::ASN1::UniversalString
ASN.1 の UniversalString 型の値を表現する Ruby のオブジェクトを生成します。
OpenSSL::ASN1::UniversalString.new と同じです。
VideotexString(value) -> OpenSSL::ASN1::VideotexString -> OpenSSL::ASN1::VideotexString
[permalink][rdoc]VideotexString(value, tag, tagging, tag_class) -> OpenSSL::ASN1::VideotexString
ASN.1 の VideotexString 型の値を表現する Ruby のオブジェクトを生成します。
OpenSSL::ASN1::VideotexString.new と同じです。
decode(der) -> OpenSSL::ASN1::ASN1Data
[permalink][rdoc]DER 表現の文字列を解析し、そこにエンコードされている ASN.1 の値を OpenSSL::ASN1::ASN1Data のサブクラスのインスタンスとして返します。
複数の ASN.1 の値が含まれている場合、先頭の値だけを返します。
ASN.1 オブジェクトが Constructive である場合は、それを構成する要素も再帰的に解析します。
例:
ruby -e ' require "openssl" require "pp" pem = File.read(ARGV[0]) cert = OpenSSL::X509::Certificate.new(pem) pp OpenSSL::ASN1.decode(cert.to_der) ' mycert.pem #<OpenSSL::ASN1::Sequence:0x814e9fc @tag=16, @tag_class=:UNIVERSAL, @tagging=nil, @value= [#<OpenSSL::ASN1::Sequence:0x814ead8 @tag=16, @tag_class=:UNIVERSAL, @tagging=nil, @value= [#<OpenSSL::ASN1::ASN1Data:0x814f690 @tag=0, @tag_class=:CONTEXT_SPECIFIC, @value= [#<OpenSSL::ASN1::Integer:0x814f6a4 @tag=2, @tag_class=:UNIVERSAL, @tagging=nil, @value=2>]>, ...
decode_all(der) -> [OpenSSL::ASN1::ASN1Data]
[permalink][rdoc]DER 表現の文字列を解析し、そこにエンコードされている ASN.1 の値を全て OpenSSL::ASN1::ASN1Data のサブクラスのインスタンスの配列として返します。
[SEE_ALSO] OpenSSL::ASN1.#decode
traverse(der) {|depth, off, hlen, len, constructed, tag_class, tag| ...} -> nil
[permalink][rdoc]DER形式の文字列を解析し、そこに含まれる ASN.1 の値のプロパティを引数として与えられたブロックを呼びだします。
OpenSSL::ASN1.#decode_all のように、文字列に含まれる全ての ASN.1 オブジェクトのインスタンスを解析します。
ブロックに渡される引数は以下の通りです。
[SEE_ALSO] OpenSSL::ASN1.#decode
BIT_STRING -> Integer
[permalink][rdoc]ASN.1 UNIVERSAL タグの、 BIT_STRING のタグ番号 3 を表す定数です。
BMPSTRING -> Integer
[permalink][rdoc]ASN.1 UNIVERSAL タグの、 BMPSTRING のタグ番号 30 を表す定数です。
BOOLEAN -> Integer
[permalink][rdoc]ASN.1 UNIVERSAL タグの、 BOOLEAN のタグ番号 1 を表す定数です。
CHARACTER_STRING -> Integer
[permalink][rdoc]ASN.1 UNIVERSAL タグの、 CHARACTER_STRING のタグ番号 29 を表す定数です。
EMBEDDED_PDV -> Integer
[permalink][rdoc]ASN.1 UNIVERSAL タグの、 EMBEDDED_PDV のタグ番号 11 を表す定数です。
ENUMERATED -> Integer
[permalink][rdoc]ASN.1 UNIVERSAL タグの、 ENUMERATED のタグ番号 10 を表す定数です。
EOC -> Integer
[permalink][rdoc]ASN.1 UNIVERSAL タグの、 EOC のタグ番号 0 を表す定数です。
EXTERNAL -> Integer
[permalink][rdoc]ASN.1 UNIVERSAL タグの、 EXTERNAL のタグ番号 8 を表す定数です。
GENERALIZEDTIME -> Integer
[permalink][rdoc]ASN.1 UNIVERSAL タグの、 GENERALIZEDTIME のタグ番号 24 を表す定数です。
GENERALSTRING -> Integer
[permalink][rdoc]ASN.1 UNIVERSAL タグの、 GENERALSTRING のタグ番号 27 を表す定数です。
GRAPHICSTRING -> Integer
[permalink][rdoc]ASN.1 UNIVERSAL タグの、 GRAPHICSTRING のタグ番号 25 を表す定数です。
IA5STRING -> Integer
[permalink][rdoc]ASN.1 UNIVERSAL タグの、 IA5STRING のタグ番号 22 を表す定数です。
INTEGER -> Integer
[permalink][rdoc]ASN.1 UNIVERSAL タグの、 INTEGER のタグ番号 2 を表す定数です。
ISO64STRING -> Integer
[permalink][rdoc]ASN.1 UNIVERSAL タグの、 ISO64STRING のタグ番号 26 を表す定数です。
NULL -> Integer
[permalink][rdoc]ASN.1 UNIVERSAL タグの、 NULL のタグ番号 5 を表す定数です。
NUMERICSTRING -> Integer
[permalink][rdoc]ASN.1 UNIVERSAL タグの、 NUMERICSTRING のタグ番号 18 を表す定数です。
OBJECT -> Integer
[permalink][rdoc]ASN.1 UNIVERSAL タグの、 OBJECT のタグ番号 6 を表す定数です。
OBJECT_DESCRIPTOR -> Integer
[permalink][rdoc]ASN.1 UNIVERSAL タグの、 OBJECT_DESCRIPTOR のタグ番号 7 を表す定数です。
OCTET_STRING -> Integer
[permalink][rdoc]ASN.1 UNIVERSAL タグの、 OCTET_STRING のタグ番号 4 を表す定数です。
PRINTABLESTRING -> Integer
[permalink][rdoc]ASN.1 UNIVERSAL タグの、 PRINTABLESTRING のタグ番号 19 を表す定数です。
REAL -> Integer
[permalink][rdoc]ASN.1 UNIVERSAL タグの、 REAL のタグ番号 9 を表す定数です。
RELATIVE_OID -> Integer
[permalink][rdoc]ASN.1 UNIVERSAL タグの、 RELATIVE_OID のタグ番号 13 を表す定数です。
SEQUENCE -> Integer
[permalink][rdoc]ASN.1 UNIVERSAL タグの、 SEQUENCE のタグ番号 16 を表す定数です。
SET -> Integer
[permalink][rdoc]ASN.1 UNIVERSAL タグの、 SET のタグ番号 17 を表す定数です。
T61STRING -> Integer
[permalink][rdoc]ASN.1 UNIVERSAL タグの、 T61STRING のタグ番号 20 を表す定数です。
UNIVERSALSTRING -> Integer
[permalink][rdoc]ASN.1 UNIVERSAL タグの、 UNIVERSALSTRING のタグ番号 28 を表す定数です。
UNIVERSAL_TAG_NAME -> [String]
[permalink][rdoc]タグ番号が表す ASN.1 オブジェクト名を収録した配列です。
例:
require 'openssl' p OpenSSL::ASN1::UNIVERSAL_TAG_NAME[0] # => "EOC" p OpenSSL::ASN1::UNIVERSAL_TAG_NAME[12] # => "UTF8STRING"
ASN.1 オブジェクトのタグ番号を表す定数が以下のように定義されています。
require 'openssl' p OpenSSL::ASN1::UTF8STRING # => 12
UTCTIME -> Integer
[permalink][rdoc]ASN.1 UNIVERSAL タグの、 UTCTIME のタグ番号 23 を表す定数です。
UTF8STRING -> Integer
[permalink][rdoc]ASN.1 UNIVERSAL タグの、 UTF8STRING のタグ番号 12 を表す定数です。
VIDEOTEXSTRING -> Integer
[permalink][rdoc]ASN.1 UNIVERSAL タグの、 VIDEOTEXSTRING のタグ番号 21 を表す定数です。