読者です 読者をやめる 読者になる 読者になる

有休wjmax

ヌルおたエンジニア。趣味は Office 365, Exchange, Azure, Powershell, AWS, VSCode, ネットワーク、セキュリティと英語など。

SSL と TLS と STARTTLS の違い

セキュリティ

メールの設定における SSL/TLS の表記に混乱してきたのでメモ。

諸悪の根源

Outlook 2016 の POP の詳細設定はこんな感じ。

f:id:wjmax:20170122133519j:plain

受信サーバーの設定は [このサーバーは暗号化された接続 (SSL) が必要] と "SSL" を使うよう記載がある。

一方で送信サーバーの設定の方は "SSL" と "TLS" が分かれて記載されており、さらに "自動" なるものも存在している。

POP の方は "SSL" しか記載がないので、"TLS" 使えないんだっけ?? となる。 SSL 3.0 は脆弱性の問題が指摘されているので、TLS が使えないってのはおかしな話。。

対してサーバー側の要件はというと、例えば Gmail の設定は以下のようになっている。

f:id:wjmax:20170122135840j:plain

POP を使用して他のメール クライアントで Gmail のメールを読む - Gmail ヘルプ

POP は 995 ポートで SSL を使用、SMTP に関しては SSL および TLS/STARTTLS の双方が使用可能らしい。

SSLTLS

ザックリいうと SSL の後継バージョンが TLS ということになる (SSL 3.0 の次のバージョンが TLS 1.0)。

以下はシマンテックのページの記載。

SSLプロトコルは、バージョンアップを重ねた後、SSL3.0を元にしたTLS(Transport Layer Security)1.0がRFC (*)として定められました。

SSL3.0とTLS1.0は大枠の仕組みは同じですが、SSLという名称が既に普及しているため、RFCにおける最新バージョンはTLS1.2であっても一般には「SSL」や「SSL/TLS」と表記することが多くなっています。

シマンテックの「SSLサーバ証明書」も認知度とそれを変更する際の混乱を考慮してSSLの表記を残しています。

SSLとTLSの違いと脆弱性 | シマンテック

シマンテック的には、混乱の回避を目的として SSLTLS を併記するやり方らしい。

TLS と STARTTLS

STARTTLS は、一度非暗号化で通信を開始した後 STARTTLS コマンドを実行し、暗号化ありの通信にアップグレードする手法のこと。

STARTTLS は明示的な TLS (Explicit TLS) とも呼ばれる。反対は暗黙的な TLS (Implicit TLS)。

この辺の説明は、Exchange のブログにわかりやすくまとめられている。

f:id:wjmax:20170122140937j:plain

https://blogs.technet.microsoft.com/exchangeteamjp/2015/08/13/exchange-tls-ssl/

クライアント側で暗黙的な TLS のポートを設定した場合、そもそも暗号化された通信でないと通信が確立されない。

たとえば POP3 の場合は、995 ポートを指定した場合はしょっぱなから SSL (TLS) の通信が開始されていなければならない。 POP3 で STARTTLS が使われる場合は、110 番ポートにまず非暗号化の通信を行ってから、STARTTLS コマンドを実行して暗号化通信にアップグレードが行われる。

文脈にもよるが、TLS と STARTTLS が対比されているような文脈において、単に TLS と書いた場合は暗黙的な TLS を指している、と思う。

telnet と OpenSSL で実験

Gmail の場合

こういうのは動作を見てみた方が理解しやすい。

ということで telnet と OpenSSL で実験。telnetSSL/TLS をお話しできないので OpenSSL を使用。

Gmail (POP3)

POP3 の 110 番ポートは完全に閉じているようで、telnet でそもそも接続できないよう。 STARTTLS が使用できるかは試すまでもなくエラー。

PS C:\OpenSSL-Win32\bin> telnet pop.gmail.com 110  
接続中: pop.gmail.com...ホストへ接続できませんでした。 ポート番号 110: 接続に失敗しました
PS C:\OpenSSL-Win32\bin> .\openssl.exe s_client -connect pop.gmail.com:110 -starttls pop3

9440:error:0200274C:system library:connect:reason(1868):crypto\bio\b_sock2.c:108:
9440:error:2008A067:BIO routines:BIO_connect:connect error:crypto\bio\b_sock2.c:109:
9440:error:0200274C:system library:connect:reason(1868):crypto\bio\b_sock2.c:108:
9440:error:2008A067:BIO routines:BIO_connect:connect error:crypto\bio\b_sock2.c:109:
connect:errno=0  

Gmail (POP3s)

telnet で 995 に接続することは可能。 STARTTLS が使用できるのであれば CAPA コマンドで STLS が返ってるくはずが、打った途端に接続が切られてしまう。

PS C:\OpenSSL-Win32\bin> telnet pop.gmail.com 995
F
ホストとの接続が切断されました。

OpenSSL で STARTTLS を実行してみても、やはり NG のよう。

PS C:\OpenSSL-Win32\bin> .\openssl.exe s_client -connect pop.gmail.com:995 -starttls pop3
CONNECTED(00000188)
write:errno=0
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 182 bytes
Verification: OK
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : 0000
    Session-ID:
    Session-ID-ctx:
    Master-Key:
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 1485063254
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
    Extended master secret: no
---


STARTTLS を打たなければ正常に接続できることがわかる。

PS C:\OpenSSL-Win32\bin> .\openssl.exe s_client -connect pop.gmail.com:995
CONNECTED(00000188)
depth=2 C = US, O = GeoTrust Inc., CN = GeoTrust Global CA
verify error:num=20:unable to get local issuer certificate
---
Certificate chain
 0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=pop.gmail.com
   i:/C=US/O=Google Inc/CN=Google Internet Authority G2
 1 s:/C=US/O=Google Inc/CN=Google Internet Authority G2
   i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
 2 s:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
   i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority
---
Server certificate
-----BEGIN CERTIFICATE-----
:
-----END CERTIFICATE-----
subject=/C=US/ST=California/L=Mountain View/O=Google Inc/CN=pop.gmail.com
issuer=/C=US/O=Google Inc/CN=Google Internet Authority G2
---
No client certificate CA names sent
Peer signing digest: SHA256
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 3688 bytes and written 261 bytes
Verification error: unable to get local issuer certificate
---
New, TLSv1.2, Cipher is ECDHE-RSA-CHACHA20-POLY1305
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2

:
---
+OK Gpop ready for requests from 119.104.67.126 j132mb246096701ywg
capa
+OK Capability list follows
USER
RESP-CODES
EXPIRE 0
LOGIN-DELAY 300
TOP
UIDL
X-GOOGLE-RICO
SASL PLAIN XOAUTH2 OAUTHBEARER


"Protocol : TLSv1.2" と書かれていることからわかる通り、TLS 1.2 で接続できている。

以下のようにオプションを指定すると TLS のバージョンを指定できる。 Gmail では TLS 1.0-1.2 をサポートしているよう。

PS C:\OpenSSL-Win32\bin> .\openssl.exe s_client -connect pop.gmail.com:995  -tls1
PS C:\OpenSSL-Win32\bin> .\openssl.exe s_client -connect pop.gmail.com:995  -tls1_1
PS C:\OpenSSL-Win32\bin> .\openssl.exe s_client -connect pop.gmail.com:995  -tls1_2

Outlook の設定画面では SSL と記載されているが、実際には TLS が少なくとも最初に試されているハズ。

Gmail (IMAP4/IMAP4s)

IMAP の場合は FQDNimap.gmail になってポート番号が変わるものの、おそらく結果は同じと思われるので省略。

SMTP の場合は・・?

SMTP の場合は少し複雑で、よく使われるポートとしては 25 番、465 番、587 番ポートがある。

ポート 用途
25 主に MTA が使用するメール中継用のポート
465 SMTPs 用のポート
587 主にクライアントが使用するメール送信用のポート

25 番と 587 番ポートは STARTTLS がサポートされていることが一般的・・なはず。 465 番はしょっぱなから SSL/TLS が使用されている通信で使用されるもの (http/80 に対する https/443 のイメージ)。

telnet と OpenSSL で試してみる

先ほどと同様に、telnet/OpenSSL で試してみるとこんな感じ。

PS C:\Users\wj> telnet smtp.gmail.com 587

220 smtp.gmail.com ESMTP b66sm27754297pgc.20 - gsmtp
ehlo xxx.yyy.com

250-smtp.gmail.com at your service, [119.104.67.126]
250-SIZE 35882577
250-8BITMIME
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-CHUNKING
250 SMTPUTF8

587 番に telnet すると 250-STARTTLS が返ってくるので STARTTLS をサポートしていることがわかる。

一方で、465 番ポートに関しては STARTTLS では接続不可。

PS C:\OpenSSL-Win32\bin> .\openssl.exe s_client -connect smtp.gmail.com:465 -starttls smtp
CONNECTED(00000184)
didn't find starttls in server response, trying anyway...
write:errno=0
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 209 bytes
Verification: OK
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : 0000
    Session-ID:
    Session-ID-ctx:
    Master-Key:
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 1485066244
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
    Extended master secret: no
---

465 番ポートに関しては、しょっぱなから TLS で接続する必要がある。

PS C:\OpenSSL-Win32\bin> .\openssl.exe s_client -connect smtp.gmail.com:465 -tls1_2
CONNECTED(0000018C)
depth=2 C = US, O = GeoTrust Inc., CN = GeoTrust Global CA
verify error:num=20:unable to get local issuer certificate
---
Certificate chain
:

---
220 smtp.gmail.com ESMTP c2sm27592058pfl.61 - gsmtp

参考

www.fastmail.com