Oct 30 2021
Support des Versions SSL sur ma JVM
Les versions SSL ou TLS supportées par une JVM dépendent de beaucoup de choses. Nous allons voir quelques facteurs dont ils dépendent, ainsi que différentes façons d’afficher les versions SSL qui sont disponibles et activées sur votre JVM.
Facteurs Affectant le Support SSL de la JVM
Les versions SSL supportées dépend en premier lieu de la version de votre JDK. TLS 1.0 et 1.1 sont désactivés sur de plus en plus de distributions JDK par défaut, alors que le TLS 1.2 est devenu plus standard. TLS 1.3 est supporté sur la JDK 11 et les suivantes, et aussi sur la JDK8 à partir du build 8u261.
Mais vous pouvez vous affranchir des paramètres par défaut et désactiver un algorithme TLS dans le fichier de sécurité Java, qui se nomme java.security. Les versions SSL / TLS peuvent être désactivés avec le paramètre jdk.tls.disabledAlgorithms.
Il n’y a en fait pas moyen d’activer explicitement une version TLS en Java: elle doit être supportée par distribution JDK et ne pas être dans la liste des algorithmes désactivés.
Vous pouvez aussi forcer l’utilisation d’une version TLS, et d’un cipher, dans les paramètres de la commande java. Faites un saut au dernier paragraphe.
Vérifier les Versions SSL / TLS par Programme
Les versions TLS supportées et activées peuvent être affichées grâce à un simple bout de code Java. La méthode getProtocols() de la classe SSLContext permet d’afficher les versions SSL disponibles sur votre JVM.
import java.util.*;
import javax.net.ssl.SSLContext;
public class tls
{
public static void main (String[] args) throws Exception
{
SSLContext context = SSLContext.getInstance("TLS");
context.init(null, null, null);
String[] supportedProtocols = context.getDefaultSSLParameters().getProtocols();
System.out.println(Arrays.toString(supportedProtocols));
}
}
Exécutez les commandes suivantes pour afficher la version de la JVM ainsi que les protocoles SSL supportés
java -version
echo "Supported TLS:"
javac tls.java
java tls
Les versions TLS sur certaines JVM de mes serveurs:
Default OpenJDK
openjdk version "1.8.0_302"
OpenJDK Runtime Environment (build 1.8.0_302-b08)
OpenJDK 64-Bit Server VM (build 25.302-b08, mixed mode)
Supported TLS:
[TLSv1.2]
IBM OpenJ9
openjdk version "1.8.0_242"
OpenJDK Runtime Environment (build 1.8.0_242-b08)
Eclipse OpenJ9 VM (build openj9-0.18.1, JRE 1.8.0 Linux amd64-64-Bit
Compressed References 20200122_511 (JIT enabled, AOT enabled)
OpenJ9 - 51a5857d2
OMR - 7a1b0239a
JCL - 8cf8a30581 based on jdk8u242-b08)
Supported TLS:
[TLSv1, TLSv1.1, TLSv1.2]
Et les versions TLS sur un mac:
Vous avez maintenant une liste sure des versions TLS activées sur votre JVM.
Vérifier Versions TLS et Ciphers avec le Mode Debug
Si vous souhaitez aller plus loin et voir vraiment ce qui se passe, utilisez la fonctionnalité debug de Java. Vous obtiendrez des détails sur les protocoles SSL désactivés, les ciphers disponibles, et les négociations SSL et bien plus. C’est très verbeux, vous êtes prévenu! Mais tellement utile.
Lancez simplement votre java avec java -Djavax.net.debug=all. Un simple programme à une base Mariadb avec JDBC et SSL activé pourrait se lancer comme ceci:
java -Djavax.net.debug=all \
-Djavax.net.ssl.trustStore=keystore.jks \
-Djavax.net.ssl.trustStorePassword=changeit \
-cp "mariadb-java-client-2.7.3.jar:." monProgramme
Ceci affichera beaucoup de d’informations sur le protocole SSL et les ciphers. Voici quelques lignes extraites:
System property jdk.tls.server.cipherSuites is set to 'null'
Ignoring disabled cipher suite: TLS_DH_anon_WITH_AES_256_CBC_SHA
[...]
update handshake state: client_hello[1]
upcoming handshake states: server_hello[2]
*** ClientHello, TLSv1.2
Cipher Suites: [TLS_DHE_RSA_WITH_AES_128_GCM_SHA256]
[...]
%% Initialized: [Session-1, TLS_DHE_RSA_WITH_AES_128_GCM_SHA256]
[...]
0000: 01 00 00 01 0A 49 00 00 02 03 64 65 66 12 69 6E .....I....def.in
0010: 66 6F 72 6D 61 74 69 6F 6E 5F 73 63 68 65 6D 61 formation_schema
0020: 06 54 41 42 4C 45 53 06 54 41 42 4C 45 53 09 54 .TABLES.TABLES.T
0030: 41 42 4C 45 5F 43 41 54 0C 54 41 42 4C 45 5F 53 ABLE_CAT.TABLE_S
0040: 43 48 45 4D 41 0C 2D 00 00 01 00 00 FD 01 00 00 CHEMA.-.........
0050: 00 00 21 00 00 03 03 64 65 66 00 00 00 0B 54 41 ..!....def....TA
0060: 42 4C 45 5F 53 43 48 45 4D 00 0C 3F 00 00 00 00 BLE_SCHEM..?....
[...]
jdk.tls.server.cipherSuites est à ‘null’ car il n’a pas été surchargé.
Il y a en général une longue liste de ciphers désactivés puisqu’ils sont liés aux protocoles TLS désactivés pour la plupart d’entre eux
On voit ensuite le hello client qui montre la version TLS choisie pour le handshake.
Cipher Suites affiche normalement une longue liste de ciphers disponibles sur la JVM. Il y en a juste un ici car je l’ai forcé.
Un peu plus bas, on peut même voir les requêtes SQL envoyées au serveur Mariadb durant l’initialisation de la connexion.
Oracle fournit une bonne documentation sur comment debugguer SSL/TLS et interpréter ces messages.
Forcer Versions TLS et Ciphers
Il est possible de forcer la JVM à utiliser certaines versions TLS et ciphers sur la ligne de command. C’est très utile si vous n’avez pas accès à la configuration de la JVM, ou si vous désirez des paramètres spécifiques pour un programme Java en particulier.
Cela peut-être fait avec les paramètres jdk.tls.client.protocols et jdk.tls.client.cipherSuites.
java -Djavax.net.debug=all \
-Djavax.net.ssl.trustStore=keystore.jks \
-Djavax.net.ssl.trustStorePassword=changeit \
-Djdk.tls.client.protocols=TLSv1.2 \
-Djdk.tls.server.cipherSuites="TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA" \
-cp "mariadb-java-client-2.7.3.jar:." monProgramme
Les protocoles TLS et les ciphers peuvent aussi être définis dans la chaîne de connexion JDBC si vous utiliser l’encryption pour la connexion à la base de données.
String url = "jdbc:mariadb://my_database_server:3306/ma_database?"+
"useSSL=true"+
"&serverTimezone=UTC"+
"&enabledSslProtocolSuites=TLSv1.2"+
"&enabledSSLCipherSuites=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA";