In base a RFC6066 , i client vincolati possono inviare URL di certificati anziché certificati completi per l'autenticazione del client TLS:
After negotiation of the use of client certificate URLs has been
successfully completed (by exchanging hellos including
"client_certificate_url" extensions), clients MAY send a
"CertificateURL" message in place of a "Certificate" message as
follows (see also Section 2):
enum {
individual_certs(0), pkipath(1), (255)
} CertChainType;
struct {
CertChainType type;
URLAndHash url_and_hash_list<1..2^16-1>;
} CertificateURL;
struct {
opaque url<1..2^16-1>;
unint8 padding;
opaque SHA1Hash[20];
} URLAndHash;
...
The hash corresponding to each URL is the SHA-1 hash of the
certificate or certificate chain (in the case of X.509 certificates,
the DER-encoded certificate or the DER-encoded PkiPath).
...
The server MUST check that the SHA-1 hash of the contents of the
object retrieved from that URL (after decoding any MIME Content-
Transfer-Encoding) matches the given hash. If any retrieved object
does not have the correct SHA-1 hash, the server MUST abort the
handshake with a bad_certificate_hash_value(114) alert. This alert
is always fatal.
Un utente malintenzionato attivo può facilmente modificare l'URL in modo che punti a un certificato (o catena di certificati) di sua scelta e amp; sostituire i 20 byte di "SHA1Hash" con il corrispondente hash SHA1 corrispondente e il server realizzerà il problema solo quando tenta di verificare il messaggio "Verifica certificato" dal client. Inoltre, il server verifica l'hash SHA1 solo dopo aver recuperato il contenuto indicato dall'URL, quindi non viene impedito alcun attacco generico come buffer overflow o SQL injection sul server che ospita l'URL. Quindi, perché l'hash SHA1 da 20 byte dell'URL incluso con questo messaggio?