Según RFC6066 , los clientes restringidos pueden enviar URL de certificado en lugar de certificados completos para la autenticación del cliente 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 atacante activo puede modificar fácilmente la URL para que apunte a un certificado (o cadena de certificados) de su elección & Reemplace los 20 bytes de "SHA1Hash" con el hash SHA1 calculado correspondiente, y el servidor se dará cuenta del problema solo cuando intente verificar el mensaje de "Verificación de certificado" del cliente. Además, el servidor verifica el hash SHA1 solo después de recuperar los contenidos señalados por la URL, por lo que tampoco se evita cualquier ataque genérico como el desbordamiento del búfer o la inyección de SQL en el servidor que aloja la URL. Entonces, ¿por qué se incluye el hash SHA1 de 20 bytes de la URL en este mensaje?