Activer TLS 1.1 et 1.2 pour les clients sur Java 7

50

Java 7 désactive TLS 1.1 et 1.2 pour les clients. De la Java Cryptography Architecture Oracle Providers Documentation :

Bien que SunJSSE dans la version Java SE 7 prenne en charge TLS 1.1 et TLS 1.2, aucune version n'est activée par défaut pour les connexions client. Certains serveurs n'implémentent pas correctement la compatibilité en aval et refusent de parler aux clients TLS 1.1 ou TLS 1.2. Pour assurer l'interopérabilité, SunJSSE n'active pas TLS 1.1 ou TLS 1.2 par défaut pour les connexions client.

Je suis intéressé par l'activation des protocoles sur un paramètre global (peut-être via un fichier de configuration), et non par une solution par application Java.

Comment activer de manière administrative TLS 1.1 et 1.2 à l'échelle du système ?

Remarque : depuis POODLE, je souhaite désactiver de manière administrative le système SSLv3. (Les problèmes liés à SSLv3 datent d'au moins 15 ans avant POODLE, mais Java / Oracle / Les développeurs ne respectaient pas les meilleures pratiques de base, de sorte que les utilisateurs comme vous et moi n'ont plus qu'à nettoyer le désordre).


Voici la version Java:

$ /Library/Java/JavaVirtualMachines/jdk1.7.0_07.jdk/Contents/Home/bin/java -version
java version "1.7.0_07"
Java(TM) SE Runtime Environment (build 1.7.0_07-b10)
Java HotSpot(TM) 64-Bit Server VM (build 23.3-b01, mixed mode)
jww
la source
La seule chose qui a fonctionné pour moi a été de définir le contexte SSLC par défaut comme décrit ici: stackoverflow.com/questions/39157422/…
shmert

Réponses:

31

Vous pouvez simplement ajouter la propriété suivante -Dhttps.protocols=TLSv1.1,TLSv1.2qui configure la machine virtuelle Java pour spécifier la version du protocole TLS à utiliser lors des connexions https.

Tomasz Rebizant
la source
6
S'il vous plaît expliquer plus de ce que cela fait. Sinon, c'est vague et potentiellement dommageable entre de mauvaises mains.
studiohack
1
@Thomasz - Je suis un peu d'accord avec les autres ici ... Comment puis-je le faire administrativement à l'échelle du système? Est-il ajouté au fichier de configuration d'une machine? Si oui, quel est le fichier et où puis-je l'ajouter?
jww
3
Ce lien vous aidera peut-être: blogs.oracle.com/java-platform-group/entry/… vous pouvez ajouter la propriété -Dhttps.protocols en tant que paramètre dans l'exemple de ligne de commande: 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 des paramètres supplémentaires: -Djavax.net.debug = tous après cela, lorsque l'application négociera une connexion https, elle affichera toutes les informations de négociation, y compris la version du protocole utilisé
Tomasz Rebizant
Ce paramètre (https.protocols) configure la machine virtuelle Java avec la version du protocole à utiliser lors de la connexion https.
Tomasz Rebizant
3
@ TomaszRebizant, oui, vous avez raison. Par exemple, ajouter export JAVA_OPTS="-Dhttps.protocols=TLSv1.1,TLSv1.2"dans le fichier setenv.sh de Tomcat active à la fois TLSv1 et TLSv2 pour toutes les connexions SSL établies à partir d'applications sur le serveur d'applications.
Zaki
14

Vous pouvez essayer d’ajouter quelque chose du type suivant à 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

cnst
la source
Lorsque vous avez trouvé ces propriétés, je ne vois nulle part où elles figurent dans la documentation de JAVA7 pour "-D deployment.security. {ProtocolName} = True / False;"
Code d'exécution
@runcode, pas tout à fait sûr, mais cela est mentionné dans le blog d'oracle.com référencé ci
cnst
1
@cnst - le problème ici est que je dois contacter chaque développeur de chaque logiciel Java et lui dire de le faire. D'où la raison pour laquelle je veux le faire administrativement une fois sur ma machine.
jww
Ca n'a pas marché pour moi.
Sridhar Sarnobat
9

Pour Java 7 sur Mac OS X, vous accédez à System Preferences > Java, et le panneau de configuration Java s'ouvre dans une fenêtre séparée. Ensuite, vous allez à l' Advancedonglet et faites défiler jusqu'à la Advanced Security Settingssection et cochez les cases à cocher Use TLS 1.1et Use TLS 1.2.

entrez la description de l'image ici

Spiff
la source
Merci Spiff. Je suis déjà configuré pour TLS 1.0 et les versions ultérieures, comme vous l'avez montré. Cependant, lorsque je crée un SSLSocket(et je suppose que cela se produit dans d'autres programmes Java), TLS 1.0 est activé (et TLS 1.1 et 1.2 sont disponibles).
jww
3
Vous pouvez également tester cela sur votre système (si vous êtes intéressé). Téléchargez ProtocolTest.java à partir de ce rapport de bogue et exécutez-le. Pour compiler et exécuter, exécutez javac ProtocolTest.java && java ProtocolTestdans un terminal. Voir ce qui apparaît sous Protocoles activés .
jww
2
Cela ne fonctionne que pour les clients et applets WebStart. Cela n'affecte pas les serveurs d'applications démarrés avec l'exécutable java.
eckes
8

J'ai récemment effectué une recherche à ce sujet et je souhaite ajouter ceci - cela ne fonctionnera pas pour JDK, le fichier deployment.properties ne concernant que les applets et autres éléments exécutés dans l'environnement JRE.

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

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

Shlomicthailand
la source
4

Il semble que les paramètres de déploiement.security. * Fonctionnent pour les programmes Java Applets et Java Web Start exécutés sur un bureau. Comme d'autres le mentionnent ici, vous pouvez éditer deployment.properties pour le spécifier.

Voici un article qui explique 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’ya aucun moyen de l’activer pour tous les programmes java sur un ordinateur qui appelle directement java.exe ou javaw.exe. Vous devez trouver chaque programme qui utilise Java, trouver le fichier de configuration dans lequel vous spécifiez les paramètres à transmettre à Java et le modifier.

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

Je ne sais pas ce qu'il faut pour que Tomcat utilise uniquement TLS 1.2 côté serveur. Nous faisons front avec Apache HTTP.

sjbotha
la source
1

Si vous êtes bloqué avec Java 7, vous pouvez ajouter -Djdk.tls.client.protocols=TLSv1.1,TLSv1.2des arguments à la machine virtuelle Java .

Notez que cela a plusieurs mises en garde:

  • Il est valide uniquement à partir de Java 7 mise à jour 95. Référence: https://blogs.oracle.com/java-platform-group/diagnosing-tls,-ssl,-and-https
  • Il ne s'agit pas d'une solution à l'échelle du système, même si elle peut être définie dans une variable d'environnement (par exemple, JAVA_OPTS). Dans ce cas, vous dépendez de la prise en charge de la variable d'environnement dans vos applications Java.

Malgré ces lacunes, je pense que cela pourrait être utile, en particulier lorsque le protocole qui nous intéresse utilise le protocole TLS mais n’est pas HTTPS, par exemple LDAPS.

[MISE À JOUR] Dans ma société, qui gère son pool de serveurs sur Ubuntu, nous nous sommes rendu compte que même la mise à jour 121 d'OpenJDK 7 n'était pas suffisante pour implémenter cela correctement. Nous avons mis à jour tous les serveurs pour mettre à jour 181 avant que cela fonctionne.

AbVog
la source