Il client non invierà un certificato a meno che il server lo richieda con un messaggio Certificate Request
(vedi lo standard , sezione 7.4.4). Se il server non richiede un certificato, è probabile che l'invio di un messaggio Certificate
e un CertificateVerify
dal client implichino una chiusura immediata dal server (con un avviso unexpected_message
). La formulazione dello standard non è eccessivamente chiara su quell'argomento, ma include ancora questo paragrafo nella sezione 7.4:
The handshake protocol messages are presented below in the order they
MUST be sent; sending handshake messages in an unexpected order
results in a fatal error. Unneeded handshake messages can be
omitted, however. Note one exception to the ordering: the
Certificate message is used twice in the handshake (from server to
client, then from client to server), but described only in its first
position. The one message that is not bound by these ordering rules
is the HelloRequest message, which can be sent at any time, but which
SHOULD be ignored by the client if it arrives in the middle of a
handshake.
Questo suggerisce piuttosto strongmente che un messaggio Certificate
imprevisto dal client non verrà ignorato e invece "causerà un errore fatale".
Ora puoi immaginare una modifica attiva da parte di un'entità Man-in-the-Middle , che inietta un messaggio Certificate Request
in più nel flusso dal server e blocca il Certificate
e Certificate Verify
dal client. Questo è possibile, dal momento che l'iniziale stretta di mano viene eseguita, per necessità, con record non protetti.
Tuttavia, questo farà sì che l'handshake fallisse quando verranno scambiati i messaggi Finished
. Questi messaggi sono protetti (si verificano dopo il passaggio ai parametri di sicurezza appena negoziati). Il contenuto dei messaggi Finished
è un hash di tutti i messaggi di handshake inviati finora. Poiché il client e il server non hanno visualizzato gli stessi messaggi (dal punto di vista del client, c'erano% extraCertificate Request
, Certificate
e Certificate Verify
messaggi), i valori dell'hash non corrispondono e il client e il server interromperà la connessione.
Quindi non solo non è chiaro ciò che un utente malintenzionato potrebbe ottenere forzando un'autenticazione client che il server non ha richiesto, ma non funzionerà affatto a causa del modo in cui vengono calcolati i messaggi Finished
.