Supongo que el modelo de amenaza es que puede haber un atacante de tipo intermediario entre Alice y Bob, y que Alice y Bob no están en la misma subred confiable. Eso es contra lo que SSL / TLS está diseñado para protegerse, y esa es la razón por la cual Alice debería verificar el certificado de Bob en su ejemplo (al menos).
Desde el punto de vista de Bob, verificar que la solicitud de Alice provenga de una dirección IP conocida no sirve de mucho. Los atacantes pueden forjar y alterar paquetes para que parezcan que provienen de la dirección IP que desean. Posteriormente, las búsquedas de DNS también son inútiles: todo lo que necesita es asegurarse de que falsifica los paquetes para usar una dirección IP con la entrada de DNS correcta.
Cuando Bob solicita un certificado de cliente a Alice durante el protocolo de enlace SSL / TLS, esto también hará que Alice envíe su certificado y use su clave privada durante el protocolo de enlace SSL / TLS para afirmar su identidad. Cuando el saludo se haya completado con éxito, Bob sabrá que Alice tiene la clave privada para ese certificado y tendrá que verificar que confíe en este certificado.
Si la solicitud proviene o no de un proxy o no, no importa cuando esté usando SSL / TLS. Un proxy HTTP simplemente canaliza la conexión SSL / TLS del cliente original al servidor de destino.
Lo que le importa a Bob es cómo va a verificar el certificado de Alice. Por lo general, esto se hará usando una PKI de la misma manera que Alice verificó el certificado de Bob, aunque no es necesario que sea el mismo CA que Bob (debe ser algo en lo que Bob confía). Tenga en cuenta que esto tampoco necesita estar usando una PKI. Es posible verificar el certificado contra una lista dada (si Alice y Bob se han reunido antes, por ejemplo), pero esto puede ser un poco más complejo ya que Bob puede tener que modificar la lista de emisores aceptados que envía (por ejemplo, enviar una vacía, lo cual está permitido explícitamente por TLS 1.1, pero no se especifica de ninguna manera en versiones anteriores, vea Mensaje de solicitud de certificado ) y usa un código personalizado para verificar ese certificado. (He implementado este tipo de esquema en el pasado y funciona bien).
Hay una excepción a esto cuando se usa lo que yo llamaría "servidores proxy MITM", es decir, los servidores proxy que están configurados para falsificar el servidor SSL / TLS real insertando su propio certificado (consulte SSL Bump de Squid ). En este caso, el certificado que ve Alice no provendría de Diginotar, sino de otra CA (normalmente una CA corporativa cuando se hace en una LAN corporativa).
Aunque Alice podría permitirse confiar en un proxy MITM de este tipo, el uso de la autenticación de certificado de cliente SSL / TLS haría que Bob se diera cuenta de que existe un MITM y que la conexión fallaría. Esto se debe a que se supone que Alice debe firmar el protocolo de enlace SSL / TLS completo (como lo ven tanto Alice como Bob) en su CertificateVerify
mensaje para autenticar con un certificado de cliente. Dado que el proxy MITM habría reemplazado el certificado de Bob, las firmas enviadas por Alice y Bob no coincidirían.