openssl s_client チートシート STARTTLS, SMTP-AUTH, POP3S

メール配送の動作チェックに`openssl s_client`コマンドを利用する.
今回は**STARTTLS**, **SMTP-AUTH**, **POP3S**を扱っていきます.

May 6, 2020 @pa_pa_paper 

## STARTTLS (mail message submission(587/tcp))

```
$ openssl s_client -quiet -connect localhost:587 -crlf -starttls smtp
```

*サーバ内部から動作チェックすることを想定. 外部環境からだと以下の方法ではエラーになる

+ **OPTIONS**

`-quiet`

セッション, 証明書の出力抑制.

`-connect host:port`

接続先のホスト名:ポート番号を指定.

`-crlf`

CR+LFが必要なサーバに対する補完機能.

`-starttls protocol`

途中からTLSに切換えるプロトコルを指定. 以下のプロトコルに対応している.

"smtp", "pop3", "imap", "ftp", "xmpp", "xmpp-server", "irc", "postgres", "lmtp", "nntp", "sieve", "ldap"

+ **セッション開始後**

通常の`telnet localhost 25`と同じように動作チェックを行う.

```
EHLO localhost
250-xxxx.vs.sakura.ne.jp
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
MAIL FROM: xxxx@xxxx.vs.sakura.ne.jp
250 2.1.0 Ok
RCPT TO: xxxx@gmail.com
250 2.1.5 Ok
```

## SMTP-AUTH

外部環境からmail message submission(587/tcp)経由でメール送信する. この場合はSMTP-AUTHが必須となる.

SMTP-AUTHしないと以下のように**Relay access denied**の554エラーメッセージが通知される.

```
$ openssl s_client -quiet -connect xxxx.vs.sakura.ne.jp:587 -crlf -starttls smtp
~
~
EHLO xxxx.vs.sakura.ne.jp
250-xxxx.vs.sakura.ne.jp
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
MAIL FROM: xxxx@xxxx.vs.sakura.ne.jp
250 2.1.0 Ok
RCPT TO: xxxx@gmail.com
554 5.7.1 <xxxx@gmail.com>: Relay access denied
```

*maillogには以下のようなエラーメッセージが出力されるはず

```
postfix/smtpd[17650]: NOQUEUE: reject: RCPT from xxxx.vs.sakura.ne.jp[xxx.xxx.xxx.xxx]: 554 5.7.1 <xxxx@gmail.com>: Relay access denied; 
```

+ **AUTH PLAIN**

BASE64エンコードした認証情報を準備する.

```
$ printf '<username>\0<username>\0<password>' | base64
xxxx=
```

AUTH PLAINで認証成功すると**235 2.7.0 Authentication successful**とメッセージが出力される.
RCPT TOの結果も**250 2.1.5 Ok**となる.

```
$ openssl s_client -quiet -connect xxxx.vs.sakura.ne.jp:587 -crlf -starttls smtp
~
~
EHLO xxxx.vs.sakura.ne.jp
250-xxxx.vs.sakura.ne.jp
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
AUTH PLAIN xxxx=
235 2.7.0 Authentication successful
MAIL FROM: xxxx@xxxx.vs.sakura.ne.jp
250 2.1.0 Ok
RCPT TO: xxxx@gmail.com
250 2.1.5 Ok
```

*maillogには下記のメッセージが出力されていた

```
postfix/smtpd[20043]: DA59C6966: client=xxxx.vs.sakura.ne.jp[xxx.xxx.xxx.xxx], sasl_method=PLAIN, sasl_username=xxx
```

+ **AUTH LOGIN**

AUTH PLAINと違いユーザ名とパスワードを別々にBASE64エンコードする.

```
$ printf '<username>' | base64
xxxx=
$ printf '<password>' | base64
xxxx=
```

`334 VXNlcm5hbWU6`は**Username:**, `334 UGFzc3dvcmQ6`は**Password:**がBASE64エンコードされて表示されている. それぞれBASE64エンコードしたユーザ名とパスワードを入力する.

```
$ openssl s_client -quiet -connect xxxx.vs.sakura.ne.jp:587 -crlf -starttls smtp
~
~
EHLO xxxx.vs.sakura.ne.jp
250-xxxx.vs.sakura.ne.jp
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
AUTH LOGIN
334 VXNlcm5hbWU6
xxxx=
334 UGFzc3dvcmQ6
xxxx=
235 2.7.0 Authentication successful
MAIL FROM: xxxx@xxxx.vs.sakura.ne.jp
250 2.1.0 Ok
RCPT TO: xxxx@gmail.com
250 2.1.5 Ok
```

## POP3S

POP3Sも要領は同じです.

```
$ openssl s_client -quiet -connect xxxx.vs.sakura.ne.jp:995 -crlf
```

普通に`telnet localhost 110`で動作チェックするのと同様のコマンドが使える.

```
~
~
+OK Dovecot ready.
USER xxxx
+OK
PASS xxxx
+OK Logged in.
LIST
+OK 3 messages:
1 3546
2 3594
3 3542
RETR 1
+OK 3546 octets
Return-Path: <xxxx@gmail.com>
X-Original-To: xxxx@xxxx.vs.sakura.ne.jp
Delivered-To: xxxx@xxxx.vs.sakura.ne.jp
~
~
```