Realmente depende de cómo su aplicación / sitio administra los certificados y las claves públicas, es decir, con qué frecuencia se rotan las claves y los certificados. Por ejemplo, si su sitio rota los certificados con mucha frecuencia, también deberá actualizar su aplicación a menudo, si está colocando el certificado. Considerando que, en este caso de uso, la clave pública de anclaje será una mejor idea ya que la clave pública asociada con el certificado permanecerá estática.
Desde el enlace OWASP que mencionó en la pregunta:
Certificado
El certificado es el más fácil de fijar. Puede obtener el certificado
de banda para el sitio web, haga que la gente de TI envíe un correo electrónico a su empresa
certificado para usted, use openssl s_client para recuperar el certificado
Cuando el certificado caduque, actualizará su aplicación.
Suponiendo que su aplicación no tenga errores o defectos de seguridad, el
La aplicación se actualizaría cada año o dos. En el tiempo de ejecución, usted
recuperar el sitio web o el certificado del servidor en la devolución de llamada. Dentro
la devolución de llamada, usted compara el certificado recuperado con el
Certificado incrustado dentro del programa. Si la comparación falla, entonces
falla el método o función.
Hay un inconveniente en fijar un certificado. Si el sitio rota su
certificado de forma regular, entonces su solicitud debería ser
actualizado regularmente Por ejemplo, Google rota sus certificados, por lo que
necesitará actualizar su aplicación aproximadamente una vez al mes (si es
Depende de los servicios de Google). A pesar de que Google gira su
certificados, las claves públicas subyacentes (dentro del certificado)
permanecer estático.
Clave pública
La fijación de claves públicas es más flexible pero un poco más complicada debido a la
Pasos adicionales necesarios para extraer la clave pública de un certificado. Como
con un certificado, el programa verifica la clave pública extraída con
Su copia incrustada de la clave pública. Hay dos desventajas dos
fijación de clave pública. Primero, es más difícil trabajar con teclas (en comparación con
certificados) ya que normalmente debe extraer la clave de la
certificado. La extracción es un inconveniente menor en Java y .Net,
pero es incómodo en Cocoa / CocoaTouch y OpenSSL. Segundo, el
La clave es estática y puede violar las políticas de rotación clave.
Con respecto a MitM, no, su conexión TLS no será vulnerable a ningún ataque MitM siempre y cuando haya implementado la identificación del certificado correctamente. Incluso si un atacante puede obtener un certificado válido para su propio dominio con la misma clave pública que su aplicación ha anclado (a través de un CA de colorete, digamos), todavía no tendrán el correspondiente clave privada . Por lo tanto, no podrá crear una conexión TLS válida con su aplicación (ya que no podrán realizar el protocolo de enlace TLS).