TLS 1.2 Certificado de servidor y signature_algorithms

2

En la especificación para TLS 1.2 , dice lo siguiente:

If the client provided a "signature_algorithms" extension, then all
certificates provided by the server MUST be signed by a hash/signature
algorithm pair that appears in that extension.

Sin embargo, cuando probé el siguiente comando en OpenSSL (como servidor), se ejecuta sin ningún problema:

openssl s_server -accept 443 -cert ecdsa-cert.crt -key ecdsa-key.key -debug -msg -state -HTTP -cipher ECDHE-RSA-AES128-SHA

Luego, ejecuto otro comando para el cliente:

openssl s_client -connect 127.0.0.1:443 -debug -cipher ECDHE-RSA-AES128-SHA

No se puede seguir procesando en la consola del servidor, dice "sin cifrado compartido". Sin embargo, cuando usé wireshark e inspeccioné el ClientHello.signature_algorithms, de hecho tenía un par ECDSA en él. Entonces me pregunto si soy yo quien malinterpreta la especificación.

    
pregunta Ryu 12.11.2013 - 09:52
fuente

3 respuestas

3

El conjunto de cifrado ECDHE-RSA-AES128-SHA significa que el intercambio de claves usará un par de claves ECDH de generación dinámica, que el servidor firmará con su propia clave privada RSA. Por lo tanto, el certificado del servidor contendrá una clave pública RSA, independientemente de cómo haya firmado ese certificado su CA.

Supongo que el certificado que utiliza contiene un par de claves EC, por lo tanto no es compatible con el conjunto de cifrado ECDHE-RSA-AES128-SHA . Es un poco tonto desde el servidor iniciar con las opciones proporcionadas, ya que, en efecto, no es compatible con ningún conjunto de cifrado. Pero se sabe que el software es tonto (a veces).

Entonces, si bien el cliente es perfectamente capaz de entender las firmas de ECDSA (y se declara como tal en su extensión signature_algorithms ), la lista de conjuntos de cifrado admitidos que configuró impide que acepte cualquier mensaje ServerKeyExchange que contenga algo más que una clave pública ECDH firmada con RSA.

Además, la extensión signature_algorithms está relacionada solo parcialmente con esto. Con esta extensión, el cliente puede anunciar los algoritmos de firma que admite, y esto tiene el propósito de ayudar al servidor a seleccionar una cadena de certificados apropiada, y algoritmos para mensajes que deben firmarse. Si el cliente dice "solo RSA", entonces el servidor debe esforzarse por usar solo firmas RSA, tanto para lo que firme (por ejemplo, mensaje ServerKeyExchange ) como para el envío de las cadenas de certificados (todos los certificados de CA deben estar basados en RSA).

Eso es, en la práctica, una ilusión. La mayoría de los servidores solo tienen un certificado, y ese es el que enviarán, independientemente de la extensión signature_algorithms . Y la mayoría de los clientes se adaptarán: si el cliente realmente admite firmas RSA, procesará las firmas RSA en certificados y en mensajes TLS. Este es el comportamiento normal en ausencia de la extensión signature_algorithms .

El uso real de esta extensión no es para limitar los posibles algoritmos de firma, ya que están restringidos tanto por el conjunto de cifrado como por el tipo de certificado que posee realmente el servidor, sino por ayudar al servidor a elegir funciones hash para ser utilizado con algoritmos de firma. Cuando el cliente dice: "Admito RSA con SHA-256", realmente le está diciendo al servidor "si debe usar firmas RSA, entonces puede hacerlo con SHA-256 como función hash de soporte, sé cómo manejarlo. ".

    
respondido por el Tom Leek 15.04.2014 - 13:33
fuente
1

Me gustaría saber si el ecdsa.crt que está usando en el servidor tiene un par de claves que está preparado para manejar RSA. Como recuerdo, no solo el cliente y el servidor deben aceptar los algoritmos de firma y / o hash, sino que el servidor debe tener un certificado y un par de claves que sean relevantes para ese algoritmo.

Mi idea es que el nombre de su certificado hace referencia a "DSA", un tipo de par de claves alternativo a "RSA", por lo que mientras configura el servidor para permitir ECDHE-RSA-AES128-SHA, no lo ha dado un par de claves que puede usar para hacer una respuesta ECDHE-RSA-AES128-SHA.

Admito que "sin cifrado compartido" no es un salto intuitivo a este camino del pensamiento, pero mi experiencia con OpenSSL es que los mensajes de error intuitivos no son probables.

    
respondido por el bethlakshmi 12.11.2013 - 17:11
fuente
-1

Está utilizando ECC con ecdsa-cert.crt, por lo que debe especificar la opción de comando -cipher ECDHE-ECDSA-AES128-SHA .

    
respondido por el sshida 15.04.2014 - 11:12
fuente

Lea otras preguntas en las etiquetas