No conozco un interruptor de línea de comandos fácil de usar, pero en la openssl s_client
línea de comandos, puede agregar la -msg
opción para obtener un volcado hexadecimal del mensaje de protocolo de enlace. Luego busca el ServerKeyExchange
mensaje; Debe tener un aspecto como este:
<<< TLS 1.2 Handshake [length 030f], ServerKeyExchange
0c 00 03 0b 01 00 ff ff ff ff ff ff ff ff c9 0f
da a2 21 68 c2 34 c4 c6 62 8b 80 dc 1c d1 29 02
4e 08 8a 67 cc 74 02 0b be a6 3b 13 9b 22 51 4a
(...)
y se lee de esa manera:
0c 00 03 0b
: mensaje de tipo "ServerKeyExchange" (ese es el "0c") de longitud 0x00030B bytes.
- El primer elemento es el módulo DH como un entero grande, con un encabezado de dos bytes de longitud. Aquí, la longitud se codifica como
01 00
, lo que significa un número entero codificado sobre 0x0100 bytes. Eso es 256 bytes, por lo que el módulo tiene una longitud entre 2041 y 2048 bits.
- Los bytes del módulo siguen, en orden big-endian sin signo. Los bytes superiores de ese módulo son, en este caso
ff ff ff ff...
,. El módulo tiene una longitud exactamente de 2048 bits.
Si usa un conjunto de cifrado ECDHE (curva elíptica), entonces el ServerKeyExchange
formato es diferente, por supuesto.
Vea el estándar para la definición del ServerKeyExchange
mensaje. Para los conjuntos de cifrado DHE, contiene el módulo p , el generador gy la clave pública DH del servidor y , en ese orden, cada uno expresado como un entero grande en el formato descrito anteriormente (encabezado de 16 bits que contiene la longitud en bytes, luego el entero valor en codificación big-endian sin signo).
Las versiones recientes de OpenSSL tienden a seleccionar un tamaño de módulo DH que coincida (desde un punto de vista de seguridad) con la fuerza del par de claves del servidor (utilizado para firmar el ServerKeyExchange
mensaje). En el ejemplo anterior, el servidor tiene una clave RSA de 2048 bits, por lo que OpenSSL eligió usar un módulo DH de 2048 bits (en este caso, el módulo conocido descrito en RFC 3526, sección 3 ).
Algunos otros servidores se adhieren a grupos DH de 1024 bits para garantizar la compatibilidad con algunos clientes existentes que no admiten grupos DH más grandes (el mayor infractor es la implementación de SSL en Java, corregida en Java 8 build 56 en 2012). Una falla conocida en el protocolo TLS, para los conjuntos de cifrado DHE, es que el cliente no tiene forma de especificar qué tamaño de módulo puede admitir (esto se corrige para ECDHE, porque el cliente puede especificar la lista exacta de curvas que acepta) .
s_client
siempre muestra "Tecla del servidor temporal" DH y tamaño o ECDH y curva cuando corresponde, justo antes de "apretón de manos ha leído xy escrito y", por lo que ya no necesita para decodificarlo Es reciente Apache mod_ssl que selecciona automáticamente DHE: httpd.apache.org/docs/trunk/mod/mod_ssl.html#sslcertificatefile (que señala el problema sobre los clientes Java).