Comment activer TLS 1.2 en Java 7
j'essaie d'activer TLS 1.2 dans mon application web qui utilise JBoss 6.4 et Java 1.7. J'ai -Dhttp.protocols = TLSv1.2
dans mon environnement d'application mais cela ne semble pas fonctionner pour moi.
y a-t-il quelque chose que je puisse faire pour activer TLS 1.2?
j'ai écrit un programme simple
context = SSLContext.getInstance("TLSv1.2");
context.init(null,null,null);
SSLContext.setDefault(context);
SSLSocketFactory factory = (SSLSocketFactory)context.getSocketFactory();
SSLSocket socket = (SSLSocket)factory.createSocket();
protocols = socket.getEnabledProtocols();
après avoir lancé ce programme dans l'application, Le TLS 1.2 est activé. Je ne veux pas exécuter ce programme, mais je veux directement l'activer pendant l'application de démarrage. Est-il possible de le faire?
7 réponses
vous pouvez mettre à jour votre version Java 7 en 1.7.0_131-b31
Pour JRE 1.7.0_131-b31 dans Oracle site :
TLSv1.2 et TLSv1.1 sont maintenant activés par défaut sur le client TLS les points d'extrémité. Ce comportement est similaire à ce qui se passe déjà dans JDK 8 publier.
il y a beaucoup de suggestions mais j'en ai trouvé deux plus communes. J'ai d'abord essayé export JAVA_OPTS="-Dhttps.protocols=SSLv3,TLSv1,TLSv1.1,TLSv1.2"
sur la ligne de commande avant le démarrage du programme, mais il ne fonctionne pas pour moi.
puis j'ai ajouté le code suivant dans le constructeur de classe de démarrage et ça a marché pour moi.
try {
SSLContext ctx = SSLContext.getInstance("TLSv1.2");
ctx.init(null, null, null);
SSLContext.setDefault(ctx);
} catch (Exception e) {
System.out.println(e.getMessage());
}
Franchement, je ne sais pas en détail pourquoi
Il y a une option de plus: System.setProperty("https.protocols", "SSLv3,TLSv1,TLSv1.1,TLSv1.2");
. Il va aussi aller dans le code, mais je ne l'ai pas essayé.
ajouter l'option suivante pour l'application java:
-Dhttps.protocols=TLSv1,TLSv1.1,TLSv1.2
ajouter ce paramètre à JAVA_OPTS ou à la ligne de commande dans maven:
-Dhttps.protocols=TLSv1.2
System.setProperty("https.protocols", "TLSv1.2");
a fonctionné dans mon cas. Avez-vous vérifié cela dans la demande?
les réponses données sont correctes, mais je partage juste une gotcha supplémentaire qui était applicable à mon cas: en plus d'utiliser setProtocol
/withProtocol
, vous pouvez avoir une certaine mauvaise pots qui ne va pas disparaître, même si le droit des pots plus ancienne:
Supprimer
<dependency>
<groupId>commons-httpclient</groupId>
<artifactId>commons-httpclient</artifactId>
<version>3.1</version>
</dependency>
Retenir
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.2</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.4.6</version>
</dependency>
Java est rétrocompatible, mais la plupart des bibliothèques ne le sont pas. Chaque jour qui passe plus j'aimerais que les bibliothèques partagées soient hors-la-loi avec ce manque de responsabilisation.
plus d'info
java version "1.7.0_80"
Java(TM) SE Runtime Environment (build 1.7.0_80-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.80-b11, mixed mode)
Vous devriez probablement regarder la configuration qui contrôle l'implémentation TLS de la plate-forme sous-jacente via -Djdk.tls.client.protocols=TLSv1.2
.