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.
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
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