SSL Module

SSL::SSLSocket

SSL/TLSプロトコルによる暗号通信を行うためのクラスです。

スーパークラス

インクルードしているモジュール

クラスメソッド

new(io, cert_file=nil, key_file=nil)

SSL::SSLSocketクラスのインスタンスを作成します。 ioにはIOオブジェクトを指定します。 cert_fileにはX.509証明書ファイル、key_fileは 秘密鍵ファイルのパス名をそれぞれ指定します。 ファイルは共にPEM形式でなければなりません。 証明書ファイルに秘密鍵が含まれる場合はkey_fileの指定は必要 ありません。

インスタンスメソッド

to_io
io

SSLSocketクラスの内部に保持しているIOクラスを返します。

cert_file = path

PEM形式のX.509証明書ファイルのパスを設定します。

cert_file

cert_file=で指定したパスを返します。

key_file = path

PEM形式の秘密鍵ファイルのパスを設定します。

key_file

key_file=で指定したパスを返します。

verify_callback = proc

Procオブジェクトを指定します。connect(accept)の際に 引数にサーバ(クライアント)から送られたX.509証明書の検証結果、 SSL::X509_STORE_CTXオブジェクトを引数にして呼び出されます。 この手続きの結果によって、ライブラリが行う検証の結果を変更する ことができます。

OpenSSLのs_serverのコール バックルーチンは次のように書き直すことが出来るでしょう。

verify_cb = Proc.new{ |ok, x509_store_ctx|
  x509 = x509_store_ctx.current_cert
  unless ok
    $stderr.print x509_store_ctx.error_message, "\n"
    if x509_store_ctx.error_depth >= YourSpecifiedDepth
      ok = true
    end 
  end
  case x509_store_ctx.error
  when SSL::X509::UNABLE_TO_GET_ISSUER_CERT
    $stderr.print "issuer=#{x509.issuer}\n"
  when SSL::X509::CERT_NOT_YET_VALID,
       SSL::X509::ERROR_IN_CERT_NOT_BEFORE_FIELD
    $stderr.print bio_err,"notBefore=#{x509.notBefore}\n"
  when SSL::X509::CERT_HAS_EXPIRED,
       SSL::X509::ERROR_IN_CERT_NOT_AFTER_FIELD
    $stderr.print(bio_err,"notAfter=#{x509.notAfter}\n"
  end
  return(ok);
}
SSL::SSLSocket.new(s, key, cert)
s.verify_mode = SSL::VERIFY_PEER|SSL::VERIFY_FAIL_IF_NO_PEER_CERT
ssl.verify_callback = verify_cb
verify_callback

verify_callback=で指定したProcオブジェクトを返します。

verify_mode = val

connectまたはacceptの際に行われる検証方法を指定します。

または、

の組合せを指定します。詳しくはSSL_CTX_set_verify(3)を参照して下さい。

verify_mode

verify_mode=で指定した値を返します。

verify_depth = val

検証を行う証明書チェーンの深さの最大値を指定します。

verify_depth

verify_depth=で指定した値を返します。

ca_file = path

PEM形式のCA証明書を含むファイルのパスを指定します。このファイルには 複数の証明書を格納することができます。Bourne Shellの場合は次のように して作成することができます。

$ cd /your/ca/certs/dir
$ rm CAfile.pem
$ for i in *.pem; do
>   openssl x509 -in $i -text >> CAfile.pem
> done
ca_file

cert_file=で指定したパスを返します。

ca_path = path

複数のPEM形式のCA証明書ファイルを含むディレクトリのパスを指定します。 ディレクトリにはCA証明書ファイルのサブジェクトの ハッシュ値をファイル名 に持つシンボリックリンクがあらかじめ作成されている必要があります。 OpenSSLパッケージに含まれるc_rehashユーティリティを利用するとよいでしょう。

$ cd /your/ca/certs/dir
$ c_rehash .
ca_path

cert_file=で指定したパスを返します。

cert

現在のセッションで使用しているX.509証明書から生成したSSL::X509 オブジェクトを返します。

peer_cert

接続先から送られて来たX.509証明書から生成したSSL::X509オブジェクト を返します。

ciphers = cipher_names

SSLセッションで使用するアルゴリズムを文字列の配列またはコロン区切り テキストで指定することができます。

ciphers

ciphers=で設定した情報を返します。設定しなくてもデフォルトの値を 取得する事ができます。

cipher

現在のセッションで使用している暗号アルゴリズムに関する情報を返します。 情報は配列に格納されており、先頭から順に

を含みます。

state

SSLセッションの状態を表す文字列を返します。実装上の都合からセッションが 確立した後でのみ有効となります。$VERBOSEがセットされていると長い形式の メッセージを返します。

connect

クライアントとしてSSLセッションを開始します。

accept

サーバとしてSSLセッションを開始します。

sysclose

SSLセッションを終了します。内部に保持したIOのクローズは行いません。

sysread(size)

Socket::sysereadに相当するメソッドです。 到着しているメッセージがsizeに満たない場合はそれ以下の長さの 文字列を返すことがあります。 SSLセッションを開始する前に呼び出した場合は、 newで指定したIOに直接書き込みを行います。

syswrite(str)

Socket::syswriteに相当するメソッドです。 SSLセッションを開始する前に呼び出した場合は、 newで指定したIOへ直接書き込みます。

SSL::X509

X.509証明書から情報を取り出す事を目的としたクラスです。

スーパークラス

クラスメソッド

new(path)

X509クラスのインスタンスを作成します。 pathはPEM形式のファイルのパスを指定します。

インスタンスメソッド

version

証明書のバージョンを返します。証明書に含まれるバージョン番号は 0からはじまりますが、ここでは実際の数値に1を足したものを返します。

serialNumber

証明書のシリアル番号を返します。

sigAlgor

証明書の署名に使われる暗号アルゴリズムを示す文字列を返します。

issuer

証明書の発行者情報を返します。

notBefore
notAfter

証明書の有効期限を示す文字列を返します。解析にはParseDateモジュール が使用できるでしょう。

subject

証明書の主体者情報を返します。

key_type

証明書に含まれる鍵の種類を示す文字列を返します。

extension

証明書の拡張部分を配列形式で返します。各要素は、

を表す文字列を含む配列です。

to_s

PEM形式のX.509証明書を返します。

verify(cacert)

casertに含まれる公開鍵を使用して、証明書を検証します。 casertはSSL::X509オブジェクトまたはPEM形式のファイルへのパスを 指定します。

SSL::X509_STORE_CTX

X509_STORE_CTXをラップするクラスです。SSLSocket#connect、SSLSocket#accept の際に、SSL::SSLScoket#verify_callback=で設定したProcに第2引数として 渡されます。

スーパークラス

インスタンスメソッド

error

現在のエラーコードを返します。エラーコードには次のものがあります。

error_message

エラーコードに対応したメッセージを返します。

current_cert

検証中の証明書をSSL::X509オブジェクトにして返します。

error_depth

現在の証明書チェーンの深さを返します。

Buffering

IO相当のバッファリング入出力をサポートするためのMix-inモジュー ルです。固定長入出力に、sysread()、syswrite()を使用します。 sysread()はIO#sysread()と同様に、入力ストリームの終りに達したら EOFErrorを投げるようにしなければいけません。また、close()の際に出力 バッファをフラッシュする必要があるため、Buffering#close()はsysclose() を使用します。

現時点でサポートしているメソッドは次の通りです。

read(size=nil)
gets(eol=$/)
getc
ungetc(c)
eof?
each
readlines
write(s)
puts(*args)
print(*args)
printf(s, *args)
flush
close

TODO