Para poder descifrar tráfico SSL/TLS necesitamos la clave privada sin passphrase del certificado digital del servidor. No se trata de ningún “hack mágico” con el que podremos descifrar el tráfico SSL/TLS.
Si necesitamos analizar el tráfico de un servidor al que tenemos un acceso legítimo, este es un método que nos permitirá poder ver en texto plano todo el tráfico cifrado que pasa por el servidor con el fin de detectar posibles anomalías en una red local.
Una vez obtenida la clave privada podremos añadirla en un sniffer de red como Wireshark, de ese modo analizar el tráfico HTTPS como si de un paquete HTTP se tratase.
Limitación con Perfect Forward Secrecy
Wireshark solo podrá descifrar el tráfico si dispones de la clave privada del servidor sin passphrase y el cifrado negociado no usa Perfect Forward Secrecy (DHE/ECDHE). Con suites PFS modernas este procedimiento no funciona; en ese caso usa
SSLKEYLOGFILEdesde el navegador.
Al intentar hacer un seguimiento de un cifrado HTTPS este se muestra como un paquete TCP. Haciendo un Follow > TCP Stream en Wireshark veremos el tráfico cifrado, como se muestra en la siguiente captura.

Figura 1: Paquete de tráfico TCP cifrado con SSL.
Exportamos el certificado con la clave privada del servidor. Una vez tenemos exportado el certificado en formato .pfx con OpenSSL lo convertimos en formato .pem que es el formato que Wireshark reconoce. Primero extraemos la clave privada del certificado y después eliminamos la contraseña de la clave privada extraída.
Extraemos la clave privada del certificado y la convertimos a formato .pem.
openssl pkcs12 in certificado.pfx -out claveprivada.pem -nocerts -nodes
Eliminamos la passphrase de la clave privada extraída anteriormente.
openssl rsa -in claveprivada.pem -out claveprivadasinpass.pem

Figura 2: Conversión y extracción de la clave privada del certificado digital .pfx.
Añadir la clave privada .pem sin passphrase extraída del certificado .pfx en Wireshark: “Edit > Preferences… > Protocols > SSL”. (Si no vemos el protocolo SSL, en las nuevas versiones de Wireshark será el equivalente a protocolo TLS). Editamos para cargar la clave privada.
- IP Address: IP del servidor.
- Port: 443
- Protocol: HTTP
- Key File: Path del fichero de la clave privada .pem.
- Password: Podremos dejar en blanco este espacio ya que el .pem de la clave privada está sin passphrase.

Figura 3: Añadir la clave privada .pem en Wireshark.
Podremos establecer un fichero de log “SSL debug file”. En el que se almacenará en texto plano todos los paquetes cifrados, también podremos analizar desde otra perspectiva el tráfico cifrado desde el fichero log.

Figura 4: Fichero log debug SSL de Wireshark.
Una vez cargada la clave privada .pem reiniciamos Wireshark para actualizar los cambios. Los paquetes TCP cifrados anteriormente serán ahora paquetes HTTP en texto plano y se podrán seguir: “Follow > SSL Stream”.

Figura 5: Seguimiento SSL Stream de paquetes HTTP descifrados.
En la siguiente captura de pantalla se puede ver el seguimiento del SSL stream en texto plano en paquetes HTTP. En este caso se trata del mismo seguimiento de paquetes TCP referenciados en la “Figura 6”.

Figura 6: SSL Stream en texto plano de paquetes HTTP.
Aunque por seguridad, en la generación de cualquier certificado se debería marcar la opción como no exportable para la clave privada, con el fin de minimizar riesgos en la organización. Ya que si alguien no autorizado consiguiese acceso al servidor este podría exportar un certificado PKCS#12 con la clave privada y generar su propia passphrase.
Saludos!