Skip to main content

Appendix E. Backward Compatibility

This appendix discusses compatibility issues between TLS 1.2 and earlier versions.

E.1. Compatibility with TLS 1.0/1.1 and SSL 3.0​

Due to new features and some structural changes, there is no direct interoperability between TLS 1.2 and TLS 1.1, TLS 1.0, and SSL 3.0. However, TLS 1.2 contains a mechanism by which a TLS 1.2 implementation can negotiate with earlier versions.

E.1.1. Version Negotiation​

TLS provides a built-in mechanism for version negotiation as part of the handshake:

  1. Version in ClientHello:

    • The client indicates the highest version it supports in the ClientHello
    • Implementations SHOULD indicate TLS 1.2 (version \{3, 3\}) in the ClientHello
  2. Version in ServerHello:

    • The server selects the highest version supported by both itself and the client
    • If the server does not support the version suggested by the client, it selects a lower version
  3. Record Layer Version:

    • The version of the ClientHello record SHOULD be set to \{3, 1\} (TLS 1.0) for maximum compatibility
    • Subsequent records use the negotiated version

E.1.2. Extensions​

TLS 1.2 introduces new extensions and changes to existing extensions:

  • signature_algorithms extension: TLS 1.2 clients MUST include this extension
  • Servers of older versions will ignore extensions they do not understand

E.1.3. Cipher Suites​

Certain cipher suites are specific to TLS 1.2:

  • Cipher suites using the SHA-256 PRF
  • New AEAD cipher suites

When negotiating with earlier versions, these cipher suites SHOULD NOT be offered in the ClientHello.

E.1.4. Implementation Recommendations​

Client implementations SHOULD:

  • Support multiple TLS versions
  • Announce the highest supported version in ClientHello
  • Be prepared to accept a lower version
  • Implement version fallback protection (SCSV)

Server implementations SHOULD:

  • Support multiple TLS versions for broad compatibility
  • Prefer the highest protocol version
  • Properly handle ClientHellos from earlier versions

Example Negotiation Flow:

Client (supports TLS 1.2, 1.1, 1.0)
-> ClientHello (version=3.3)
Supported versions: TLS 1.2, 1.1, 1.0

Server (supports only TLS 1.1, 1.0)
<- ServerHello (version=3.2)
Selected: TLS 1.1

Connection continues using TLS 1.1

E.2. Compatibility with SSL 2.0​

SSL 2.0 SHOULD NOT be used in new implementations. However, for compatibility with legacy systems, some implementations may need to understand SSL 2.0-format ClientHellos.

E.2.1. SSL 2.0 ClientHello​

The SSL 2.0 ClientHello has a different format:

uint16 msg_length;          /* Highest bit MUST be 1 */
uint8 msg_type; /* MUST be 1 */
Version version; /* Version desired by client */
uint16 cipher_spec_length; /* Cannot be 0 */
uint16 session_id_length; /* MUST be 0 or 16 */
uint16 challenge_length; /* Cannot be 0 */
CipherSpec cipher_specs[...];
SessionID session_id;
Challenge challenge;

E.2.2. Handling SSL 2.0 ClientHello​

A TLS 1.2 server MAY accept a ClientHello encapsulated in SSL 2.0 format, but MUST:

  1. Check the highest bit of msg_length
  2. Verify format validity
  3. Convert it to TLS format for processing
  4. Respond with a TLS-format ServerHello

E.2.3. Security Considerations​

Important: Supporting SSL 2.0-format ClientHellos does not mean supporting the SSL 2.0 protocol itself. SSL 2.0 has many known security vulnerabilities and MUST NOT be negotiated for use.

E.2.4. Implementation Recommendations​

  • TLS 1.2 clients MUST NOT send SSL 2.0-format ClientHellos
  • Server support for SSL 2.0-format ClientHellos is now MAY, rather than SHOULD
  • Sending SSL 2.0-format ClientHellos is SHOULD NOT
  • Future TLS versions may change this to SHOULD NOT support

E.3. Avoiding Man-in-the-Middle Version Rollback​

Earlier versions of the protocol were vulnerable to version rollback attacks where an attacker could force a connection to use an earlier (weaker) protocol version.

E.3.1. Protection Mechanisms​

TLS 1.2 uses multiple mechanisms to prevent version rollback:

  1. Finished Message Verification:

    • The Finished message contains a hash of all handshake messages
    • Includes the version fields from ClientHello and ServerHello
    • Any version modification will cause Finished verification to fail
  2. TLS_FALLBACK_SCSV:

    • Signaling Cipher Suite Value defined in RFC 7507
    • Clients include this value when retrying a connection with a lower version
    • Server rejects the connection if it supports a higher version

E.3.2. Implementation Requirements​

Clients MUST:

  • Record previously attempted versions
  • Include TLS_FALLBACK_SCSV when downgrading retry
  • Verify Finished message

Servers MUST:

  • Check for TLS_FALLBACK_SCSV
  • Send inappropriate_fallback alert if a higher version is supported
  • Correctly compute and verify Finished message

E.3.3. Example Scenarios​

Normal Connection:

Client -> ClientHello (TLS 1.2)
Server <- ServerHello (TLS 1.2)
... Normal handshake ...
Success!

Legitimate Downgrade:

Client -> ClientHello (TLS 1.2)
Server <- ServerHello (TLS 1.1)
... TLS 1.1 handshake ...
Success!

Detected Attack:

Client -> ClientHello (TLS 1.2)
Attacker modifies to (TLS 1.0)
Server <- ServerHello (TLS 1.0)
... Handshake continues ...
Client -> Finished (verification fails!)
Connection aborted!

Retry with SCSV:

Client -> ClientHello (TLS 1.2) - Fails
Client -> ClientHello (TLS 1.1, TLS_FALLBACK_SCSV)
Server detects SCSV and supports TLS 1.2
Server <- Alert: inappropriate_fallback
Connection aborted - Downgrade attack detected!

Note: For complete compatibility information and detailed explanations, please refer to the full text of RFC 5246 Appendix E.