
Estoy intentando realizar una extracción/cifrado/descifrado de datos manual con la openssl
herramienta de línea de comandos.
He estado revisando RFC5246 para determinar qué debo hacer. No tengo muy claro si podré realizar este paso con esa herramienta. Supongo que la clave privada en la explicación es la clave privada generada cuando creé mi certificado autofirmado.
Cuando se utiliza RSA para la autenticación del servidor y el intercambio de claves, el cliente genera un pre_master_secret de 48 bytes, lo cifra con la clave pública del servidor y lo envía al servidor. El servidor utiliza su clave privada para descifrar el pre_master_secret. Luego, ambas partes convierten el pre_master_secret en master_secret, como se especifica anteriormente.
¿Alguien puede decirme si mis suposiciones son correctas? ¿Se puede utilizar la openssl
herramienta de línea de comandos y suministrarla con la clave privada de mi servidor y el pre_master_secret cifrado del cliente para generar la clave pre_master para el servidor de modo que pueda usarse para crear la clave maestra?
Si es así, no estoy seguro de cómo hacerlo porque no estoy muy familiarizado con la herramienta.
La otra cosa que debo señalar es que el conjunto de cifrado con el que estoy trabajando es TLS_RSA_WITH_AES_256_CBC_SHA y puedo ver en Wireshark que el pre_master_secret del cliente tiene 256 bytes de longitud.
Respuesta1
No estoy del todo seguro pero creo que la respuesta es no. El openssl
cliente de línea de comandos es una colección heterogénea de herramientas. Los comandos X.509 pueden ser útiles para manipular certificados, pero los comandos de criptografía rara vez son útiles para otra cosa que no sea probar OpenSSL.
Si necesita realizar cálculos criptográficos con algoritmos comunes, le recomiendo la línea de comando interactiva de Python con elCriptodomobiblioteca.
Pero para descifrar conexiones SSL, la forma más sencilla suele ser utilizar Wireshark.Dígale a Wireshark dónde encontrar la clave privaday descifrará una conexión TLS que utiliza cifrado RSA. Para conexiones que utilizan Diffie-Hellman efímera, no puede descifrar el tráfico solo con la clave, necesitainformación adicional del cliente o del servidor.
Tenga en cuenta que utilizar ciphersuite TLS_RSA_WITH_AES_256_CBC_SHA
es una mala idea por varias razones:
- no tienesecreto directo, por lo que si la clave privada del servidor alguna vez se ve comprometida, todas las conexiones realizadas con esta clave también se verán comprometidas. Los conjuntos de cifrado que utilizan un intercambio de claves Diffie-Hellman (con EDH o ECDHE en su nombre) tienen secreto directo.
- Utiliza descifrado RSA, que implica relleno, que es una fuente clásica de errores de implementación y fugas a través de canales laterales. Los conjuntos de cifrado con EDH o ECDHE en su nombre además de RSA, o con DSA o ECDSA, utilizan firmas en lugar de descifrado y es menos probable que sufran defectos de implementación.
- Utiliza descifrado CBC, que implica relleno, que es una fuente clásica de errores de implementación y fugas a través de canales laterales. Los conjuntos de cifrado sin CBC en su nombre tienen menos probabilidades de sufrir defectos de implementación.
Respuesta2
RSAES-PKCS1v1_5, que utiliza el intercambio de claves RSA simple SSL/TLS a través de 1.2, se puede descifrar mediante operaciones de línea de comandos OpenSSLrsautl
opkeyutl
(este último desde 1.1.0 en 2010). Consulte sus respectivas páginas de manual, que deberían estar disponibles en su sistema si no es Windows, oen línea.
Tenga en cuenta que esto le proporciona el secreto previo al maestro, que por sí solo no puede descifrar (o autenticar) el tráfico. Debe utilizar el premaster más los nonces para derivar el secreto maestro y luego el secreto maestro más los nonces para derivar las claves de trabajo (plural). La función de derivación 'PRF' difiere entre SSLv3 (ya no se usa), TLS 1.0 y 1.1 (RFC 2246 y 4346) y TLS 1.2 (RFC 5246). (PRF volverá a diferir en TLS 1.3 tal como está redactado, pero eso también eliminará por completo el intercambio de claves RSA simple).
La línea de comandos no puede acceder a los PRF SSL/TLS directamente, pero puede acceder a los HMAC a partir de los cuales se construyen (excepto SSLv3); consulte la página de manual dgst
en los mismos lugares que la anterior, y la nota -hmac $key
solo puede manejar secuencias de bytes que se pueden pasar desde shell/etc, lo cual no es todo, por lo que es posible que lo necesite -mac hmac -macopt hexkey:$hexkey
.
Dicho esto, estoy de acuerdo con Gilles en que es mucho más fácil dejar que Wireshark lo haga. Si su problema es que tiene los datos en alguna forma que no sea un archivo de captura, las distribuciones de Wireshark vienen con varias herramientas de línea de comandos auxiliares para manipular archivos que generalmente pueden construir una captura falsa, que en este caso Wireshark o tshark main pueden luego descifrar.