とりあえず使う
まずはとりあえずクライアントとサーバーを作る。 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 に値代入するのはやらんでも動くけど、せっかくなんでやった方がいいんじゃないかと思われるたぶん。