wjmax blog

インフラ エンジニア -> サポート エンジニア。英語とアニメと日本酒を嗜む。

STARTTLS とは。SSL と TLS と STARTTLS の違い

メールの設定などで見かける SSL/TLS/STARTTLS という表記。 アプリケーションやサービスによっては、必ずしも正確に使い分けが (あえて) されていない場合があります。

この記事では、SSL/TLS/STARTTLS がそれぞれ何を意味するのか、またそれらの違いについて、動作確認も含めて解説します。

Outlook の表記

例として、Outlook 2016 の POP の詳細設定を見てみましょう。

f:id:wjmax:20170122133519j:plain

受信サーバーの設定は [このサーバーは暗号化された接続 (SSL) が必要] と "SSL" を使うような記載になっています。

一方で送信サーバーの設定の方は "SSL" と "TLS" が分かれて記載されており、さらに "自動" という設定もありますね。

POP の方は "SSL" しか記載がないので、"TLS" が使えない??と思ってしまうのも無理がない話です。 ただ、いまどき SSL 3.0 は脆弱性の問題があるため、MS 製品で 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のまとめ | DigiCert & Symantec

シマンテック的には、混乱の回避を目的として SSLTLS を併記しているようです。

TLS と STARTTLS

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

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

この辺の説明は、MS のメール サーバー (Exchange) のサポート ブログが参考になります。

f:id:wjmax:20170122140937j:plain

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

経験上、単に TLS と呼ぶ場合は暗黙的な TLS (Implicit TLS) を指している場合が多いような気がします。 (暗黙的な) TLS の場合、最初から TLS で暗号化された状態から通信が開始されることをサーバー側は想定しています。 そのため、通信を確立した後で STARTTLS を実行しようと思っても、最初の通信自体が確立されません (検証例は後述)。

たとえば POP3 の場合は、クライアント側の設定で 995 ポートを指定するのであれば、最初から TLS の通信が開始されていなければなりません。 POP3 で STARTTLS が使われる場合は、110 番ポートにまず非暗号化の通信を行ってから、STARTTLS コマンドを実行して暗号化通信にアップグレードが行われることになります (が、このパターンはあまり聞いたことがありません)。

telnet と OpenSSL で実験

Gmail の場合

こういうのは動作を見てみた方が理解しやすいため、Gmail を例にして動作確認してみましょう。

なお、telnet と OpenSSL というツール (コマンド) で実験しています。

telnetWindows OS だと既定で無効ですが有効化可能です。OpenSSL はネット上で Windows 版がダウンロードできます。 telnetSSL/TLS を使用できないので、暗号化した通信を検証するには OpenSSL が必要となります。

Gmail (POP3)

POP3 の 110 番ポートは完全に閉じているようで、telnet でそもそも接続できないようです。 STARTTLS が使用できるかは試すまでもなくエラーとなります (接続してから STARTTLS を実行するため、接続できない場合は 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 ではなく、(暗黙的な) TLS 接続であれば正常に接続できることがわかります。

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 が少なくとも最初に試されていると思います。 (TLS1.2 -> TLS1.1 -> TLS1.0 のように、バージョンが新しい順に試行しているかもしれませんが未検証。)

Gmail (IMAP4/IMAP4s)

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

SMTP の場合は・・?

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

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

25 番と 587 番ポートは STARTTLS がサポートされていることが一般的だと思います。 465 番は通信の最初から SSL/TLS が使用されることが想定されます (http/80 に対する https/443 のイメージ)。

telnet と OpenSSL で試してみる

先ほどと同様に、telnet/OpenSSL で試してみると以下のような結果となりました。

PS C:\Users\> 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