¿Cómo imponer el secreto perfecto hacia delante usando las propiedades de JVM?

4

Según this blogpost Perfect Forward Secrecy (PFS) es proporcionada por:

  

Cualquier cosa en la lista de nombres de algoritmos que comience con TLS   (Seguridad del nivel de transporte) seguido de un tipo de DHE (Diffie-Hellman   Intercambio).

Por ejemplo, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA

Quiero lograr esto usando la propiedad 'jdk.tls.disabledAlgorithms' de Java en el archivo java.security. Ahora mismo tengo los siguientes valores para esa propiedad:

jdk.tls.disabledAlgorithms = SSLv3, TLSv1, TLSv1.1, RC4, MD5, DESede, DH keySize < 768, RSA keySize < 2048

Y a continuación está el resultado de TestSSLServer:

$ java -jar TestSSLServer.jar 127.0.0.1 9443
Supported versions: TLSv1.2
Deflate compression: no
Supported cipher suites (ORDER IS NOT SIGNIFICANT):
  TLSv1.2
     DHE_RSA_WITH_AES_128_CBC_SHA
     DHE_RSA_WITH_AES_256_CBC_SHA
     DHE_RSA_WITH_AES_128_CBC_SHA256
     DHE_RSA_WITH_AES_256_CBC_SHA256
     TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
     TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
     TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
     TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
     TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
     TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
     TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
     TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
----------------------
Server certificate(s):
  xxxxx
----------------------
Minimal encryption strength:     strong encryption (96-bit or more)
Achievable encryption strength:  strong encryption (96-bit or more)
BEAST status: protected
CRIME status: protected

Todavía no pude encontrar un mecanismo para deshacerme de las suites que no proporcionan PFS. P.ej. 'DHE_RSA_WITH_AES_128_CBC_SHA'.

¿Podemos hacer esto con 'jdk.tls.disabledAlgorithms'? Si no es así, ¿hay algún otro mecanismo de nivel JVM?

ACTUALIZACIÓN :

Después de que @Steffen confirmó que todos mis cifrados anteriores proporcionaban PFS, probé nuevamente con otro servidor y puedo ver que RSA aparece como un algoritmo de intercambio de claves. Esta vez probé con 2 herramientas, ambas recomendadas por OWASP

jdk.tls.disabledAlgorithms = SSLv3, TLSv1, TLSv1.1, RC4, MD5, DESede, RSA keySize < 2048

NOTA: configurando 'DH keySize < 2048 'usando esta propiedad no tuvo ningún efecto. Tuve que usar la propiedad del sistema "-Djdk.tls.ephemeralDHKeySize = 2048" para aumentar el tamaño de la clave DH como lo recomienda @Steffen.

TestSSLServer

Supported cipher suites (ORDER IS NOT SIGNIFICANT):
  TLSv1.2
     RSA_WITH_AES_128_CBC_SHA
     DHE_RSA_WITH_AES_128_CBC_SHA
     RSA_WITH_AES_256_CBC_SHA
     DHE_RSA_WITH_AES_256_CBC_SHA
     RSA_WITH_AES_128_CBC_SHA256
     RSA_WITH_AES_256_CBC_SHA256
     DHE_RSA_WITH_AES_128_CBC_SHA256
     DHE_RSA_WITH_AES_256_CBC_SHA256
     TLS_RSA_WITH_AES_128_GCM_SHA256
     TLS_RSA_WITH_AES_256_GCM_SHA384
     TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
     TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
     TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
     TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
     TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
     TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
     TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
     TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384

testssl.sh

Testing all 124 locally available ciphers against the server, ordered by encryption strength 

Hexcode  Cipher Suite Name (OpenSSL)       KeyExch.  Encryption Bits
------------------------------------------------------------------------
 xc030   ECDHE-RSA-AES256-GCM-SHA384       ECDH 256   AESGCM    256       
 xc028   ECDHE-RSA-AES256-SHA384           ECDH 256   AES       256       
 xc014   ECDHE-RSA-AES256-SHA              ECDH 256   AES       256       
 x9f     DHE-RSA-AES256-GCM-SHA384         DH 2048    AESGCM    256       
 x6b     DHE-RSA-AES256-SHA256             DH 2048    AES       256       
 x39     DHE-RSA-AES256-SHA                DH 2048    AES       256       
 x9d     AES256-GCM-SHA384                 RSA        AESGCM    256       
 x3d     AES256-SHA256                     RSA        AES       256       
 x35     AES256-SHA                        RSA        AES       256       
 xc02f   ECDHE-RSA-AES128-GCM-SHA256       ECDH 256   AESGCM    128       
 xc027   ECDHE-RSA-AES128-SHA256           ECDH 256   AES       128       
 xc013   ECDHE-RSA-AES128-SHA              ECDH 256   AES       128       
 x9e     DHE-RSA-AES128-GCM-SHA256         DH 2048    AESGCM    128       
 x67     DHE-RSA-AES128-SHA256             DH 2048    AES       128       
 x33     DHE-RSA-AES128-SHA                DH 2048    AES       128       
 x9c     AES128-GCM-SHA256                 RSA        AESGCM    128       
 x3c     AES128-SHA256                     RSA        AES       128       
 x2f     AES128-SHA                        RSA        AES       128       

No puedo especificar RSA como cifrado deshabilitado, porque también eliminará RSA de la lista de autenticación, no solo el intercambio de claves.

¿Cómo puedo lograr PFS a través de una propiedad / configuración de nivel JVM? Estoy ejecutando el cliente y el servidor en la misma máquina con Java 1.8.0_111

    
pregunta drox 20.12.2016 - 11:07
fuente

2 respuestas

2

Es posible imponer el secreto de reenvío al enumerar todos los conjuntos de cifrado que el SSLtest de Qualys llama "débil" en jdk.tls.disabledAlgorithms en java.security . Consulte la respuesta de Bart Mortelmans en enlace .

Terminé con esto:

[root@dolphin12 ~]# grep ^jdk.tls.dis -A6 /usr/lib/jvm/java/jre/lib/security/java.security
jdk.tls.disabledAlgorithms=SSLv2Hello, SSLv3, TLSv1, TLSv1.1, DES, DESede, RC4, MD5withRSA, DH keySize < 1024, \
    EC keySize < 224, DES40_CBC, RC4_40, \
    TLS_RSA_WITH_AES_256_CBC_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA, \
    TLS_RSA_WITH_AES_128_CBC_SHA256, TLS_RSA_WITH_AES_128_CBC_SHA, \
    TLS_RSA_WITH_AES_256_GCM_SHA384, TLS_RSA_WITH_AES_128_GCM_SHA256, \
    TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_DHE_RSA_WITH_AES_256_CBC_SHA, \
    TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA

Puede haber algunas cosas ineficientes, innecesarias o dobles allí, pero me otorga una calificación A y también impidió que la herramienta de seguridad de Chrome se quejara de AES_256_CBC with HMAC-SHA1 , que llama "un cifrado obsoleto".

    
respondido por el Onnonymous 23.08.2018 - 15:22
fuente
1

Todas las suites de cifrado que ofrece proporcionan PFS porque todas son suites de cifrado DHE y ECDHE. El RSA en DHE_RSA_WITH_AES_128_CBC_SHA solo especifica que RSA se utiliza para la autenticación. Pero DHE se usa para el intercambio de claves, que es la parte importante de PFS.

Aparte de eso: todavía permite un tamaño de clave DH de 768 bits que se considera débil. Utilice al menos 1024 bits pero mejor 2048 para DH.

    
respondido por el Steffen Ullrich 20.12.2016 - 12:04
fuente

Lea otras preguntas en las etiquetas