← RFC Reference

RFC 8314: Cleartext Considered Obsolete

Standards Track Transport Security Published January 2018
ELI5: For years, email clients connected to servers on a cleartext port, then asked to “upgrade” to encryption (STARTTLS). That’s like starting a phone call on speakerphone in a crowded room, then whispering “let’s switch to a private line.” RFC 8314 says: just start on the private line. Connect with TLS from the very first byte — no upgrade step, no window for eavesdropping.

Why This Exists

Email has historically used three cleartext ports for client-to-server communication:

Port Protocol Purpose
25 SMTP Server-to-server relay
143 IMAP Mailbox access
110 POP3 Mailbox access
587 Submission Client message submission

All four start as cleartext connections. STARTTLS was bolted on to upgrade these connections to TLS mid-stream. But STARTTLS has systemic weaknesses:

RFC 8314 declares these cleartext connections obsolete for email submission and mailbox access, and mandates implicit TLS as the replacement.

How It Works

Implicit TLS vs. STARTTLS

STARTTLS (the old way): Connect on a cleartext port, exchange greetings in plaintext, send a STARTTLS command, negotiate TLS, then proceed with the encrypted session.

-- STARTTLS on port 587 (submission) --
220 mail.example.com ESMTP          ← cleartext greeting
EHLO client.example.com             ← cleartext
250-mail.example.com                ← cleartext
250-STARTTLS                        ← attacker can strip this line
250 OK
STARTTLS                            ← cleartext
220 Go ahead                        ← cleartext
-- TLS handshake happens here --
EHLO client.example.com             ← now encrypted
AUTH PLAIN dXNlcjpwYXNz            ← encrypted (safe)

Implicit TLS (the RFC 8314 way): Connect to a dedicated TLS port. TLS handshake is the very first thing that happens. No cleartext phase at all.

-- Implicit TLS on port 465 (submissions) --
-- TLS handshake happens immediately on connect --
220 mail.example.com ESMTP          ← encrypted from first byte
EHLO client.example.com             ← encrypted
AUTH PLAIN dXNlcjpwYXNz            ← encrypted

The New Port Assignments

Service Old (STARTTLS) New (Implicit TLS) IANA Name
Message Submission 587 465 submissions
IMAP 143 993 imaps
POP3 110 995 pop3s

Port 465 has a complicated history. It was originally assigned for "SMTPS" in the late 1990s, then revoked in favor of STARTTLS on 587. RFC 8314 re-assigns it as submissions (note the 's') for implicit TLS submission. This time it's official and permanent.

What About Port 25?

Port 25 is for server-to-server relay, not client submission. RFC 8314 does not change port 25 behavior. Server-to-server SMTP still uses opportunistic STARTTLS, with MTA-STS or DANE providing enforcement. The distinction matters: clients authenticate with credentials (which must be protected), while servers authenticate via DNS, DKIM, and SPF.

Key Technical Details

TLS Version Requirements

RFC 8314 requires TLS 1.2 or later. TLS 1.0 and 1.1 are deprecated by RFC 8996. In practice, you should require TLS 1.2 minimum and prefer TLS 1.3.

Certificate Validation

With implicit TLS, clients must validate the server certificate against the expected hostname using standard Web PKI rules. This is a significant change from the STARTTLS era where many clients accepted any certificate. The certificate must:

SRV Records for Service Discovery

RFC 8314 works alongside RFC 6186 for automatic client configuration via SRV records:

; Implicit TLS submission (RFC 8314 + RFC 6186) _submissions._tcp.example.com. IN SRV 0 1 465 mail.example.com. ; Implicit TLS IMAP _imaps._tcp.example.com. IN SRV 0 1 993 mail.example.com. ; Implicit TLS POP3 _pop3s._tcp.example.com. IN SRV 0 1 995 mail.example.com.

Client Configuration

For application developers integrating SMTP submission:

# Python example: implicit TLS on port 465
import smtplib

# Correct: SMTP_SSL connects with TLS immediately
with smtplib.SMTP_SSL('mail.example.com', 465) as smtp:
    smtp.login('user', 'password')
    smtp.send_message(msg)

# Avoid: STARTTLS on port 587 (legacy)
# with smtplib.SMTP('mail.example.com', 587) as smtp:
#     smtp.starttls()
#     smtp.login('user', 'password')

Common Mistakes

Deliverability Impact

Related RFCs