概要: openssl s_client コマンドについて
telnet コマンドで HTTP や SMTP、POP の接続テストを行うことがあるが、同様に openssl の s_client サブコマンドで、TLS 接続の手動確認をすることが可能だ。例えば、HTTPS の確認は以下のように実行できる。
$ openssl s_client -connect www.example.com:443 (中略) GET / HTTP/1.0(Enter) Host: www.example.com(Enter2回押す)
さらに、最初は平文接続して、アプリケーションプロトコル上の STARTTLS コマンドで TLS 状態に入りたい場合もある。SMTP、IMAP、LDAP、FTP などの STARTTLS が相当する。これも s_client サブコマンドの -starttls オプションで実現できる。
mail.example.com サーバの TCPポート 587 (SMTP Submission) で SMTP STARTTLS が使える場合、以下のコマンドで接続が可能となる。-starttls オプションの引数に、smtp をとる。
$ openssl s_client -connect mail.example.com:587 -starttls smtp
ただし、SMTP セッションの中で RCPT TO: を大文字で打った瞬間に、RENEGOTIATING という表示とともに先へ進めなくなってしまうので注意が必要である。
$ openssl s_client -connect mail.example.com:587 -starttls smtp CONNECTED(00000003) depth=2 C = JP, O = "SECOM Trust Systems CO.,LTD.", OU = Security Communication RootCA2 verify return:1 depth=1 C = JP, L = Academe, O = National Institute of Informatics, CN = NII Open Domain CA - G4 verify return:1 depth=0 C = JP, L = Academe, O = Example, OU = Example Dept, CN = mail.example.com verify return:1 (中略) 250 DSN EHLO mail.example.com 250-mail.example.com 250-PIPELINING 250-SIZE 52428800 250-ETRN 250-AUTH PLAIN LOGIN 250-AUTH=PLAIN LOGIN 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN MAIL FROM: test@example.com 250 2.1.0 Ok RCPT TO: test@example.jp RENEGOTIATING depth=2 C = JP, O = "SECOM Trust Systems CO.,LTD.", OU = Security Communication RootCA2 verify return:1 depth=1 C = JP, L = Academe, O = National Institute of Informatics, CN = NII Open Domain CA - G4 verify return:1 depth=0 C = JP, L = Academe, O = Example, OU = Example Dept, CN = mail.example.com verify return:1
標準入力の一文字目が大文字の「R」になっていると、openssl s_client の TLS 再ネゴシエーションコマンドとして解釈されてしまうためである。
再ネゴシエーションを回避するには、先頭の r を小文字で打つか、openssl s_client のオプションとして -ign_eof または -quiet を追加する。
$ openssl s_client -quiet -connect mail.example.com:587 -starttls smtp
SMTP AUTH のテスト
上記の openssl s_client コマンドを用いて、SMTP のセッションを手打ちで再現テストする。さらに SMTP セッションの中で、SMTP AUTH のテストも組み込んでみる。
実行例1: AUTH PLAIN 認証
SMTP AUTH の PLAIN コマンドで必要な文字列は、「ユーザ名\0ユーザ名\0パスワード」(\0はヌル文字)という合成文字列を BASE64 エンコードしたものである。あらかじめ文字列を作っておく。
$ printf 'username\0username\0password' | base64 dXNlcm5hbWUAdXNlcm5hbWUAcGFzc3dvcmQ=
さきほどのエンコード文字列を AUTH PLAIN の引数として与える。
$ openssl s_client -quiet -connect mail.example.com:587 -starttls smtp depth=2 C = JP, O = "SECOM Trust Systems CO.,LTD.", OU = Security Communication RootCA2 verify return:1 depth=1 C = JP, L = Academe, O = National Institute of Informatics, CN = NII Open Domain CA - G4 verify return:1 depth=0 C = JP, L = Academe, O = Example, OU = Example Dept, CN = mail.example.com verify return:1 250 DSN EHLO mail.example.com 250-mail.example.com 250-PIPELINING 250-SIZE 10485760 250-ETRN 250-AUTH PLAIN LOGIN 250-AUTH=PLAIN LOGIN 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN AUTH PLAIN dXNlcm5hbWUAdXNlcm5hbWUAcGFzc3dvcmQ= 235 2.7.0 Authentication successful ←認証成功 MAIL FROM: test@example.com 250 2.1.0 Ok RCPT TO: test@example.jp 250 2.1.5 Ok ←メールリレー成功 QUIT 221 2.0.0 Bye
実行例2: AUTH LOGIN 認証
AUTH LOGIN コマンドでは、ユーザ名とパスワードをそれぞれ BASE64 エンコードした文字列が必要になる。
$ printf 'username' | base64 dXNlcm5hbWU= $ printf 'password' | base64 cGFzc3dvcmQ=
サーバからの 334 VXNlcm5hbWU6 に対してはユーザ名のエンコード文字列を、334 UGFzc3dvcmQ6 に対してはパスワードのエンコード文字列を入力する。
$ openssl s_client -quiet -connect mail.example.com:587 -starttls smtp depth=2 C = JP, O = "SECOM Trust Systems CO.,LTD.", OU = Security Communication RootCA2 verify return:1 depth=1 C = JP, L = Academe, O = National Institute of Informatics, CN = NII Open Domain CA - G4 verify return:1 depth=0 C = JP, L = Academe, O = Example, OU = Example Dept, CN = mail.example.com verify return:1 250 DSN EHLO mail.example.com 250-mail.example.com 250-PIPELINING 250-SIZE 10485760 250-ETRN 250-AUTH PLAIN LOGIN 250-AUTH=PLAIN LOGIN 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN AUTH LOGIN 334 VXNlcm5hbWU6 ←"Username:" が BASE64 エンコードされている dXNlcm5hbWU= 334 UGFzc3dvcmQ6 ←"Password:" が BASE64 エンコードされている cGFzc3dvcmQ= 235 2.7.0 Authentication successful ←認証成功 MAIL FROM: test@example.com 250 2.1.0 Ok RCPT TO: test@example.jp 250 2.1.5 Ok ←メールリレー成功 QUIT 221 2.0.0 Bye
参考URL: