Ruby 1.9.3 リファレンスマニュアル > ライブラリ一覧 > opensslライブラリ > OpenSSL::ASN1モジュール
クラスの継承リスト: OpenSSL::ASN1
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 なタグ付けを実現することもできます。
例:
# 単純型のデータ
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
* ITU-T Rec. X.680-699 http://www.itu.int/itu-t/recommendations/index.aspx?ser=X
BMPString(value) -> OpenSSL::ASN1::BMPString -> OpenSSL::ASN1::BMPString[permalink][rdoc]BMPString(value, tag, tagging, tag_class) -> OpenSSL::ASN1::BMPStringASN.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::BitStringASN.1 の BitString 型の値を表現する Ruby のオブジェクトを 生成します。
OpenSSL::ASN1::BitString.new と同じです。
Boolean(value) -> OpenSSL::ASN1::Boolean[permalink][rdoc]Boolean(value , tag , tagging , tag_class) -> OpenSSL::ASN1::BooleanASN.1 の Boolean 型の値を表現する OpenSSL::ASN1::Boolean オブジェクトを 生成します。
OpenSSL::ASN::Boolean.new と同じです。
Enumerated(value) -> OpenSSL::ASN1::Enumerated[permalink][rdoc]Enumerated(value, tag, tagging, tag_class) -> OpenSSL::ASN1::EnumeratedASN.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::GeneralStringASN.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::GeneralizedTimeASN.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::GraphicStringASN.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::IA5StringASN.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::ISO64StringASN.1 の ISO64String 型の値を表現する Ruby のオブジェクトを 生成します。
OpenSSL::ASN1::ISO64String.new と同じです。
Integer(value) -> OpenSSL::ASN1::Integer[permalink][rdoc]Integer(value, tag, tagging, tag_class) -> OpenSSL::ASN1::IntegerASN.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::NullASN.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::NumericStringASN.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::ObjectIdASN.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::OctetStringASN.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::PrintableStringASN.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::SequenceASN.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::SetASN.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::T61StringASN.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::UTCTimeASN.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::UTF8StringASN.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::UniversalStringASN.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::VideotexStringASN.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| ...} -> Qnil[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 を表す定数です。