STARTTLS とは。SSL と TLS と STARTTLS の違い
メールの設定などで見かける SSL/TLS/STARTTLS という表記。 アプリケーションやサービスによっては、必ずしも正確に使い分けが (あえて) されていない場合があります。
この記事では、SSL/TLS/STARTTLS がそれぞれ何を意味するのか、またそれらの違いについて、動作確認も含めて解説します。
Outlook の表記
例として、Outlook 2016 の POP の詳細設定を見てみましょう。
受信サーバーの設定は [このサーバーは暗号化された接続 (SSL) が必要] と "SSL" を使うような記載になっています。
一方で送信サーバーの設定の方は "SSL" と "TLS" が分かれて記載されており、さらに "自動" という設定もありますね。
POP の方は "SSL" しか記載がないので、"TLS" が使えない??と思ってしまうのも無理がない話です。 ただ、いまどき SSL 3.0 は脆弱性の問題があるため、MS 製品で TLS が使えないというのはかなり不自然です。
対してサーバー側の要件はというと、例えば Gmail の設定は以下のようになっています。
POP は 995 ポートで SSL を使用、SMTP に関しては SSL および TLS/STARTTLS の双方が使用可能、という記載です。
SSL と TLS
ザックリいうと 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 と TLS を併記しているようです。
TLS と STARTTLS
STARTTLS は、一度非暗号化で通信を開始した後 STARTTLS コマンドを実行し、途中から暗号化ありの通信にアップグレードする手法のことです。
STARTTLS は明示的な TLS (Explicit TLS) とも呼ばれます。反対は暗黙的な TLS (Implicit TLS) です。
この辺の説明は、MS のメール サーバー (Exchange) のサポート ブログが参考になります。
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 というツール (コマンド) で実験しています。
telnet は Windows OS だと既定で無効ですが有効化可能です。OpenSSL はネット上で Windows 版がダウンロードできます。 telnet は SSL/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 の場合は FQDN が imap.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