55 votes

Activer TLS 1.1 et 1.2 pour les clients sur Java 7

Java 7 désactive TLS 1.1 et 1.2 pour les clients. De Oracle Providers Documentation de l'architecture de cryptographie Java:

Bien que SunJSSE dans la version Java SE 7 supporte TLS 1.1 et TLS 1.2, aucune des versions n'est activée par défaut pour les connexions client. Certains serveurs n'implémentent pas correctement la compatibilité ascendante et refusent de dialoguer avec des clients TLS 1.1 ou TLS 1.2. Pour l'interopérabilité, SunJSSE n'active pas par défaut TLS 1.1 ou TLS 1.2 pour les connexions client.

Je suis intéressé par l'activation des protocoles au niveau du système (peut-être via un fichier de configuration) et non une solution par application Java.

Comment puis-je activer administrativement TLS 1.1 et 1.2 au niveau du système?

Remarque : depuis POODLE, je voudrais désactiver administrativement SSLv3 au niveau du système. (Les problèmes avec SSLv3 datent d'au moins 15 ans avant POODLE, mais Java/Oracle/Les développeurs n'ont pas respecté les meilleures pratiques de base, donc des utilisateurs comme vous et moi se retrouvent à nettoyer le gâchis).


Voici la version de Java:

$ /Library/Java/JavaVirtualMachines/jdk1.7.0_07.jdk/Contents/Home/bin/java -version
java version "1.7.0_07"
Environnement d'exécution Java(TM) SE (version 1.7.0_07-b10)
Java HotSpot(TM) 64-Bit Server VM (version 23.3-b01, mode mixte)

0 votes

La seule chose qui a fonctionné pour moi a été de définir le SSLContext par défaut comme décrit ici : stackoverflow.com/questions/39157422/…

33voto

Tomasz Rebizant Points 449

Vous pourriez simplement ajouter la propriété suivante -Dhttps.protocols=TLSv1.1,TLSv1.2 qui configure le JVM pour spécifier quelle version de protocole TLS doit être utilisée lors des connexions https.

6 votes

Veuillez expliquer plus en détail ce que cela fait. Sinon, cela est vague et potentiellement nuisible entre de mauvaises mains.

1 votes

@Thomasz - Je suis plutôt d'accord avec les autres ici... Comment puis-je le faire au niveau administratif sur l'ensemble du système ? Est-ce que cela est ajouté au fichier de configuration de la machine ? Si c'est le cas, quel est le fichier et où dois-je l'ajouter ?

6 votes

Peut-être que ce lien vous aidera : blogs.oracle.com/java-platform-group/entry/… vous pouvez ajouter la propriété -Dhttps.protocols en tant que paramètre dans la ligne de commande exemple : java -jar yourapplication.jar -Dhttps.protocols=TLSv1.2 ou quelque part dans les fichiers de configuration de l'application (serveur). Vous pouvez vérifier si cela fonctionne en ajoutant un paramètre supplémentaire : -Djavax.net.debug=all après cela, lorsque l'application négociera la connexion https, elle affichera toutes les informations de négociation, y compris la version de protocole utilisée.

13voto

purecharger Points 840

Vous pourriez essayer d'ajouter quelque chose comme ce qui suit à votre script de démarrage, en supposant que Java 1.7:

JAVACMD="$JAVACMD -Ddeployment.security.SSLv2Hello=false -Ddeployment.security.SSLv3=false -Ddeployment.security.TLSv1=false -D\ deployment.security.TLSv1.1=true -Ddeployment.security.TLSv1.2=true"

Quelques autres suggestions : https://blogs.oracle.com/java-platform-group/entry/java_8_will_use_tls

0 votes

Où avez-vous trouvé cette documentation des propriétés, je ne vois nulle part mention de cela dans les documents de JAVA7 pour "-D deployment.security.{NomDuProtocole} = Vrai/Faux;"

0 votes

@runcode, pas exactement sûr, mais il est mentionné dans le blog oracle.com référencé ci-dessus

1 votes

@cnst - le problème ici est que j'ai besoin de contacter chaque développeur de chaque programme Java, et leur dire de le faire. C'est pourquoi je veux le faire de manière administrative une seule fois sur ma machine.

8voto

Spiff Points 95683

Pour Java 7 sur Mac OS X, vous allez dans Préférences Système > Java, et le Panneau de Contrôle Java s'ouvre dans une fenêtre séparée. Ensuite, vous allez dans l'onglet Avancé et faites défiler jusqu'à la section Paramètres de Sécurité Avancés et cochez les cases Utiliser TLS 1.1 et Utiliser TLS 1.2.

entrer la description de l'image ici

0 votes

Merci Spiff. Je suis déjà configuré pour TLS 1.0 et supérieur comme vous l'avez montré. Cependant, lorsque je crée un SSLSocket (et je suppose que cela arrive à d'autres programmes Java), TLS 1.0 est activé (et TLS 1.1 et 1.2 sont disponibles).

3 votes

Vous pouvez également tester ceci sur votre système (si intéressé). Téléchargez ProtocolTest.java depuis ce rapport de bug et exécutez-le. Pour compiler et exécuter, exécutez javac ProtocolTest.java && java ProtocolTest dans un terminal. Voyez ce qui apparaît sous Protocoles activés.

2 votes

Cela ne fonctionne que pour les clients WebStart et les applets. Cela n'affecte pas les serveurs d'applications démarrés avec l'exécutable java.

8voto

witchbutter Points 91

Je viens de faire des recherches récemment et je veux ajouter - cela ne fonctionnera pas pour JDK, le deployment.properties est seulement pertinent pour les Applets et d'autres éléments s'exécutant dans le JRE.

Pour les applications JDK (un serveur qui doit se connecter à LDAP par exemple), le serveur est un client mais le deployment.security ne fonctionnerait pas.

Aucun moyen de le changer à moins d'écrire du code comme SSLContext.getInstance("TLSv1.2");

4voto

dvim Points 151

Il semble que les paramètres deployment.security.* fonctionnent pour les applets Java et les programmes Java Web Start s'exécutant sur un ordinateur de bureau. Comme d'autres l'ont mentionné ici, vous pouvez modifier deployment.properties pour le spécifier.

Voici un article qui montre comment utiliser une stratégie de groupe pour déployer le même fichier deployment.properties pour tous les utilisateurs : http://www.darkoperator.com/blog/2013/1/12/pushing-security-configuration-for-java-7-update-10-via-gpo.html

Malheureusement, il n'y a pas de moyen d'activer ceci pour tous les programmes Java sur un ordinateur qui appellent directement java.exe ou javaw.exe. Vous devez trouver chaque programme qui utilise Java, trouver le fichier de configuration où vous spécifiez les paramètres à transmettre à Java et le modifier.

Pour Tomcat, nous devions passer par ceci pour que les connexions de Tomcat vers d'autres serveurs utilisent TLS 1.1+ : -Dhttps.protocols=TLSv1.1,TLSv1.2. Sur Linux, cela peut être fait en modifiant bin/catalina.sh ou en créant bin/setenv.sh.

Je ne sais pas ce qu'il faut faire pour que Tomcat n'utilise que TLS 1.2 côté serveur. Nous utilisons Apache HTTP en frontal.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X