ソケットをラップして SSL での認証と暗号通信を実現するためのクラスです。
SSL/TLS サーバに接続して write します。
require 'socket' require 'openssl' include OpenSSL soc = TCPSocket.new('www.example.com', 443) ssl = SSL::SSLSocket.new(soc) ssl.connect ssl.post_connection_check('www.example.com') raise "verification error" if ssl.verify_result != OpenSSL::X509::V_OK ssl.write('hoge') print ssl.peer_cert.to_text ssl.close soc.close
new(socket) -> OpenSSL::SSL::SSLSocket
[permalink][rdoc]new(socket, context) -> OpenSSL::SSL::SSLSocket
socket をラップして SSLSocket オブジェクトを生成します。
socket には ラップする TCPSocket オブジェクトを与え、 context には SSL の設定情報を所持している OpenSSL::SSL::SSLContext オブジェクトを与えます。
context を省略した場合は OpenSSL::SSL::SSLContext.new で新たにコンテキストを生成してそれを用います。
accept -> self
[permalink][rdoc]TLS/SSL 通信をサーバモードとして開始し、クライアントからのハンドシェイク開始を待ち、クライアントとのハンドシェイクを実行します。
[SEE_ALSO] OpenSSL::SSL::SSLSocket#connect, OpenSSL::SSL::SSLSocket#accept_nonblock
accept_nonblock -> self
[permalink][rdoc]ノンブロッキング方式で TLS/SSL 通信をサーバモードとして開始し、クライアントとのハンドシェイクを実行します。
IO が読み込み待ち、もしくは書き込み待ちになった場合は例外を発生させ、ハンドシェイクを中断します。IO が読み込み/書き込み可能状態になってからこのメソッドをもう一度呼ぶとハンドシェイクを再開します。
[SEE_ALSO] OpenSSL::SSL::SSLSocket#connect_nonblock, OpenSSL::SSL::SSLSocket#accept
cert -> OpenSSL::X509::Certificate | nil
[permalink][rdoc]自分自身を証明する証明書を返します。
自分自身を証明する証明書を使わなかった場合は nil を返します。 OpenSSL::SSL::SSLSocket#connect や OpenSSL::SSL::SSLSocket#accept で SSL/TLS ハンドシェイクを行う前にこのメソッドを呼んだ場合も nil を返します。
[SEE_ALSO] OpenSSL::SSL::SSLContext#cert
cipher -> [String, String, Integer, Integer]
[permalink][rdoc]現在実際に使われている暗号の情報を配列で返します。
返される配列の形式は以下の例のように [暗号名, TLS/SSLのバージョン, 鍵長, アルゴリズムで使われる bit 数] となります。
["DES-CBC3-SHA", "TLSv1/SSLv3", 168, 168]
OpenSSL::SSL::SSLSocket#connect や OpenSSL::SSL::SSLSocket#accept で SSL/TLS ハンドシェイクを行う前にこのメソッドを呼ぶと nil を返します。
connect -> self
[permalink][rdoc]TLS/SSl 通信をクライアントモードとして開始し、サーバとのハンドシェイクを実行します。
[SEE_ALSO] OpenSSL::SSL::SSLSocket#accept, OpenSSL::SSL::SSLSocket#connect_nonblock
connect_nonblock -> self
[permalink][rdoc]ノンブロッキング方式で TLS/SSL 通信をクライアントモードとして開始し、サーバとのハンドシェイクを実行します。
IO が読み込み待ち、もしくは書き込み待ちになった場合は例外を発生させ、ハンドシェイクを中断します。IO が読み込み/書き込み可能状態になってからこのメソッドをもう一度呼ぶとハンドシェイクを再開します。
[SEE_ALSO] OpenSSL::SSL::SSLSocket#accept_nonblock, OpenSSL::SSL::SSLSocket#connect
context -> OpenSSL::SSL::SSLContext
[permalink][rdoc]SSLSocket オブジェクトを生成する時に渡されたコンテクストを返します。
[SEE_ALSO] OpenSSL::SSL::SSLSocket.new
hostname -> String | nil
[permalink][rdoc]TLS の Server Name Indication 拡張で利用するサーバのホスト名を返します。
OpenSSL::SSL::SSLSocket#hostname= で設定した値がそのまま返されます。
設定していない場合は nil を返します。
[SEE_ALSO] OpenSSL::SSL::SSLSocket#hostname=
hostname=(hostname)
[permalink][rdoc]TLS の Server Name Indication(SNI) 拡張で利用するサーバのホスト名を設定します。
Server Name Indication については [RFC3546] を参照してください。
このメソッドはハンドシェイク時にクライアント側がサーバ側にサーバのホスト名を伝えるために用います。そのため、クライアント側が OpenSSL::SSL::SSLSocket#connect を呼ぶ前にこのメソッドでホスト名を指定する必要があります。
hostname に nil を渡すと SNI 拡張を利用しません。
サーバ側については OpenSSL::SSL::SSLContext#servername_cb= を参照してください。
[SEE_ALSO] OpenSSL::SSL::SSLSocket#hostname, OpenSSL::SSL::SSLContext#servername_cb, OpenSSL::SSL::SSLContext#servername_cb=
io -> IO
[permalink][rdoc]to_io -> IO
SSLSocket オブジェクトを生成する時に渡されたソケットを返します。
[SEE_ALSO] OpenSSL::SSL::SSLSocket.new
peer_cert -> OpenSSL::X509::Certificate | nil
[permalink][rdoc]接続相手の証明書オブジェクトを返します。
OpenSSL::SSL::SSLSocket#connect や OpenSSL::SSL::SSLSocket#accept で SSL/TLS ハンドシェイクを行う前にこのメソッドを呼ぶと nil を返します。
[SEE_ALSO] OpenSSL::SSL::SSLSocket#peer_cert_chain
peer_cert_chain -> [OpenSSL::X509::Certificate] | nil
[permalink][rdoc]接続相手の証明書チェインを OpenSSL::X509::Certificate オブジェクトの配列で返します。
OpenSSL::SSL::SSLSocket#connect や OpenSSL::SSL::SSLSocket#accept で SSL/TLS ハンドシェイクを行う前にこのメソッドを呼ぶと nil を返します。
以下の順の配列を返します。
[接続相手の証明書, 下位CAの証明書,... 中間CAの証明書]
ルート CA の証明書は含まれないことに注意してください。
[SEE_ALSO] OpenSSL::SSL::SSLSocket#peer_cert
pending -> Integer | nil
[permalink][rdoc]OpenSSL内部のバッファが保持している、直ちに読み取り可能なデータのバイト数を返します。
ハンドシェイク開始前には nil を返します。
post_connection_check(hostname) -> true
[permalink][rdoc]接続後検証を行います。
検証に成功した場合は true を返し、失敗した場合は例外 OpenSSL::SSL::SSLError を発生させます。
OpenSSL の API では、 OpenSSL::SSL::SSLSocket#connect や OpenSSL::SSL::SSLSocket#accept での検証は実用的には不完全です。 CA が証明書に署名してそれが失効していないことしか確認しません。実用上は証明書に記載されている事項を見て、接続先が妥当であるかを確認する必要があります。通常は接続先ホストの FQDN と証明書に記載されている FQDN が一致しているかどうかを調べます。このメソッドはその FQDN のチェックを行ないます。
session -> OpenSSL::SSL::Session
[permalink][rdoc]利用している SSL セッションを OpenSSL::SSL::Session オブジェクトで返します。
[SEE_ALSO] OpenSSL::SSL::SSLSocket#session=, OpenSSL::SSL::SSLSocket#session_reused?
session=(sess)
[permalink][rdoc]ハンドシェイクで再利用する SSL セッションを設定します。
このメソッドはクライアント側でのみ有用です。セッションを再利用する場合は、 OpenSSL::SSL::SSLSocket#connect を呼ぶ前にこのメソッドでセッションオブジェクト (OpenSSL::SSL::Session のインスタンス) を設定します。
サーバ側の場合 OpenSSL::SSL::SSLContext がキャッシュの保持と管理を行います。
[SEE_ALSO] OpenSSL::SSL::SSLSocket#session, OpenSSL::SSL::SSLSocket#session_reused?
session_reused? -> bool
[permalink][rdoc]利用している SSL セッションが再利用されたものである場合に真を返します。
[SEE_ALSO] OpenSSL::SSL::Session, OpenSSL::SSL::SSLSocket#session, OpenSSL::SSL::SSLSocket#session=
state -> String
[permalink][rdoc]現在の状態をアルファベット 6 文字の文字列で返します。
sync_close -> bool
[permalink][rdoc]SSLSocket を close するときにラップしているソケットも close するかどうかを返します。
true でソケットも close します。
sync_close=(bool)
[permalink][rdoc]SSLSocket を close するときにラップしているソケットも close するかどうかを設定します。
true でソケットも close するようになります。
sysclose -> nil
[permalink][rdoc]接続を閉じます。相手に'close notify'を送ります。
このメソッドは openssl ライブラリ内で管理しているバッファをフラッシュせずに接続を閉じます。そのため、通常はこれではなく OpenSSL::Buffering#close を呼ぶべきです。
OpenSSL::SSL::SSLSocket#sync_close が真である場合はこのメソッドを呼びだした時点で自身が保持しているソケットを同時に閉じます。
sysread(length, buf=nil) -> String
[permalink][rdoc]データをバッファを経由せずに暗号化通信路から読み込み、読み込んだデータを文字列で返します。
基本的にはこのメソッドは使わず、OpenSSL::Buffering のメソッドを使ってデータを読み込むべきです。
length で読み込むバイト数を指定します。
bufに文字列を指定するとその文字列のメモリ領域にデータを直接書き込み、その String オブジェクトを返します。
IO#sysread と同様です。
syswrite(string) -> Integer
[permalink][rdoc]データをバッファを経由せずに暗号化通信路に書き込みます。
書き込んだバイト数を整数で返します。
基本的にはこのメソッドは使わず、OpenSSL::Buffering のメソッドを使ってデータを書き込むべきです。
IO#syswrite と同様です。
verify_result -> Integer
[permalink][rdoc]検証結果のエラーコードを整数値で返します。
エラーコードの整数値は OpenSSL::X509 に定数が定義されています。詳しくは OpenSSL::X509/検証時エラー定数 を見てください。検証に成功した場合は OpenSSL::X509::V_OK を返します。