2013年11月30日土曜日

stunnel、stoneを使ったクライアント認証用ssl/tls経路

◆ 目的
1. smtps, imaps用の試験メールサービスを利用する
2. 試験サービスなので第三者にはサーバへ接続させない
3. 2.の目的を達するためにクライアント認証を利用する

クライアント認証を利用する場合、
クライアント側が証明書と秘密鍵を持つ。
通常のクライアント・サーバモデルの逆である。

(簡易図)
                             smtp.example.com 465/tcp
                             imap.example.com 993/tcp 
 --------                    --------
| client |----------------->| server |
 --------                    --------
           ssl/tls Client 
             Authentication  
         |------------------|
          stunnel または
          stone を利用する


ssl/tlsをしゃべるクライアント用モジュールは多数あるが、
クライアント認証に利用できるものは少ない。

そのため、stunnelまたはstoneを利用して
本モデルのssl/tls経路を作り通信を通す。
その手順を残しておく(証明書作成の手順はここでは紹介しない)。
設定ファイル内のclient.keyとclient.crtは準備していることを前提とする。



◆ stunnelを利用する場合
● 設定
$ vi stunnel.conf 
client = yes
cert = /etc/pki/CA/client.crt
key = /etc/pki/CA/private/client.key
debug = 7
output = /var/log/stunnel/access.log
pid = /var/run/stunnel.pid
socket = l:TCP_NODELAY=1
socket = r:TCP_NODELAY=1
;foreground = yes

[smtps]
accept = 10587
connect = smtp.example.com:465

[imaps]
accept = 10143
connect = imap.example.com:993


● 起動
ローカルに設定するポートが既に使われていないことは事前に確認しておくこと。
$ stunnel stunnel.cfg


● 実行例
ツールの実装は省略する。
一点。ssl/tls処理はstunnelが対応するため、
非ssl/tls用のクライアントで実行すればよい。
$ ./smtp_auth.rb localhost 10587

$ ./imap.rb localhost 10143

暗号化処理については考えなくてよいので、
telnetしてながら手動でプロトコルを打ってもよいだろう。
$ telnet localhost 10587

$ telnet localhost 10143



◆ stoneを利用する場合
● 設定
$ vi stone.cfg 
-L /var/log/stone/error.log
-a /var/log/stone/access.log
-dd
-n
-q key=/etc/pki/CA/private/client.key
-q cert=/etc/pki/CA/client.crt
smtp.example.com:465/ssl localhost:10587
--
imap.example.com:993/ssl localhost:10143


● 起動
$ stone -C stone.cfg


● 実行例
stunnelの場合と同じである。