とりあえず使う

まずはとりあえずクライアントとサーバーを作る。 OpenSSL というとオレオレ認証局を作るのがめんどいという感じだけど、 Debian だと

 # apt-get install ssl-cert
 # make-ssl-cert generate-default-snakeoil

こんだけで /etc/ssl/certs/ssl-cert-snakeoil.pem と /etc/ssl/private/ssl-cert-snakeoil.key ができる。ちゃんと作るなら /usr/share/ssl-cert/ssleay.cnf を編集して使えばいいんだけど、これもまぁすごい簡単で、いずれにせよずいぶん楽にできるんだなぁと思った(なんか昔 expect とかで作ってたなー)。

でまぁそれでできたファイルを /tmp の下に置いたとして、サーバ例 in Ruby:

 #!/usr/bin/env ruby
 
 require 'openssl'
 require 'socket'
 include OpenSSL
 
 srv = TCPServer.new(4444)
 if ARGV[0]
   ctx = SSL::SSLContext.new(ARGV[0])
   ctx.cert = X509::Certificate.new(File.read('/tmp/ssl-cert-snakeoil.pem'))
   ctx.key = PKey::RSA.new(File.read('/tmp/ssl-cert-snakeoil.key'))
   srv = SSL::SSLServer.new(srv, ctx)
 end
 while s = srv.accept
   cont = s.gets
   s.print(cont)
   s.close
 end

引数で SSLv23|SSLv2|SSLv3|TLSv1 のどれかを指定すると SSL なサーバになって、つけないと普通の TCP サーバになる。 SSLContext の引数は省略すると SSLv23 。

クライアント例 in Ruby:

 #!/usr/bin/env ruby
 
 require 'openssl'
 require 'socket'
 include OpenSSL
 
 s = TCPSocket.new('localhost', 4444)
 if ARGV[0]
   ctx = SSL::SSLContext.new(ARGV[0])
   ctx.ca_file = '/tmp/ssl-cert-snakeoil.pem'
   ctx.verify_mode = SSL::VERIFY_PEER
   s = SSL::SSLSocket.new(s, ctx)
   s.connect
 end
 s.puts("hogehoge")
 puts s.read
 s.close

同じく引数で通信方式を指定している。 ctx 作って ca_file と verify_mode に値代入するのはやらんでも動くけど、せっかくなんでやった方がいいんじゃないかと思われるたぶん。

なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h