3.1. Panoramica
Il client indica che supporta questo meccanismo includendo un'estensione TLS SessionTicket nel messaggio ClientHello. L'estensione sarà vuota se il client non possiede già un ticket per il server. Il server invia un'estensione SessionTicket vuota per indicare che invierà un nuovo ticket di sessione usando il messaggio di handshake NewSessionTicket. L'estensione è descritta nella Sezione 3.2.
Se il server vuole usare questo meccanismo, memorizza il proprio stato di sessione (come la suite di cifratura e il master secret) in un ticket che è cifrato e protetto nell'integrità da una chiave nota solo al server. Il ticket è distribuito al client usando il messaggio di handshake TLS NewSessionTicket descritto nella Sezione 3.3. Questo messaggio è inviato durante l'handshake TLS prima del messaggio ChangeCipherSpec, dopo che il server ha verificato con successo il messaggio Finished del client.
Client Server
ClientHello
(empty SessionTicket extension)-------->
ServerHello
(empty SessionTicket extension)
Certificate*
ServerKeyExchange*
CertificateRequest*
<-------- ServerHelloDone
Certificate*
ClientKeyExchange
CertificateVerify*
[ChangeCipherSpec]
Finished -------->
NewSessionTicket
[ChangeCipherSpec]
<-------- Finished
Application Data <-------> Application Data
Figura 1: flusso dei messaggi per l'handshake completo che emette un nuovo ticket di sessione
Il client memorizza nella cache questo ticket insieme al master secret e agli altri parametri associati alla sessione corrente. Quando il client desidera riprendere la sessione, include il ticket nell'estensione SessionTicket all'interno del messaggio ClientHello. L'Appendice A fornisce una descrizione dettagliata della codifica dell'estensione e delle modifiche rispetto all'RFC 4507. Il server decifra quindi il ticket ricevuto, verifica la validità del ticket, recupera lo stato della sessione dal contenuto del ticket e usa questo stato per riprendere la sessione. L'interazione con il Session ID TLS è descritta nella Sezione 3.4. Se il server verifica con successo il ticket del client, può rinnovare il ticket includendo un messaggio di handshake NewSessionTicket dopo il ServerHello.
Client Server
ClientHello
(SessionTicket extension) -------->
ServerHello
(empty SessionTicket extension)
NewSessionTicket
[ChangeCipherSpec]
<-------- Finished
[ChangeCipherSpec]
Finished -------->
Application Data <-------> Application Data
Figura 2: flusso dei messaggi per l'handshake abbreviato che usa un nuovo ticket di sessione
Nella Sezione 4 è fornito un formato di ticket raccomandato.
Se il server non può o non vuole onorare il ticket, può avviare un handshake completo con il client.
Nel caso in cui il server non desideri emettere un nuovo ticket in questo momento, si limita a completare l'handshake senza includere un'estensione SessionTicket o un messaggio di handshake NewSessionTicket. Ciò è mostrato di seguito (questo flusso è identico alla Figura 1 dell'RFC 4346, fatta eccezione per l'estensione SessionTicket nel primo messaggio):
Client Server
ClientHello
(SessionTicket extension) -------->
ServerHello
Certificate*
ServerKeyExchange*
CertificateRequest*
<-------- ServerHelloDone
Certificate*
ClientKeyExchange
CertificateVerify*
[ChangeCipherSpec]
Finished -------->
[ChangeCipherSpec]
<-------- Finished
Application Data <-------> Application Data
Figura 3: flusso dei messaggi per il server che completa l'handshake completo senza emettere un nuovo ticket di sessione
È inoltre consentito uno scambio simile alla Figura 3 usando l'handshake abbreviato definito nella Figura 2 dell'RFC 4346, in cui il client usa l'estensione SessionTicket per riprendere la sessione, ma il server non desidera emettere un nuovo ticket e pertanto non invia un'estensione SessionTicket.
Se il server rifiuta il ticket, può comunque desiderare di emettere un nuovo ticket dopo aver eseguito l'handshake completo come mostrato di seguito (questo flusso è identico alla Figura 1, tranne per il fatto che l'estensione SessionTicket nel ClientHello non è vuota):
Client Server
ClientHello
(SessionTicket extension) -------->
ServerHello
(empty SessionTicket extension)
Certificate*
ServerKeyExchange*
CertificateRequest*
<-------- ServerHelloDone
Certificate*
ClientKeyExchange
CertificateVerify*
[ChangeCipherSpec]
Finished -------->
NewSessionTicket
[ChangeCipherSpec]
<-------- Finished
Application Data <-------> Application Data
Figura 4: flusso dei messaggi per il server che rifiuta il ticket, esegue l'handshake completo ed emette un nuovo ticket di sessione