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.
Puis-je faire quelque chose 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 l'exécution de ce programme dans l'application, TLS 1.2 est activé. Je ne veux pas exécuter ce programme, mais je veux l'activer directement lors du démarrage de l'application. Y a-t-il un moyen de le faire?
Vous pouvez mettre à niveau votre version de Java 7 vers la version 1.7.0_131-b31.
Pour JRE 1.7.0_131-b31 sur le site Oracle:
TLSv1.2 et TLSv1.1 sont maintenant activés par défaut sur le client TLS points finaux. Ce comportement est similaire à ce qui se passe déjà dans JDK 8 communiqués.
Il y a beaucoup de suggestions mais j'ai trouvé deux d'entre elles les plus courantes. 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 cela n'a pas fonctionné pour moi.
Ensuite, j'ai ajouté le code suivant dans le constructeur de la classe de démarrage et cela a fonctionné 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 ctx.init(null, null, null);
mais tous (SSL/TLS) fonctionnent bien pour moi.
Il existe une option supplémentaire: System.setProperty("https.protocols", "SSLv3,TLSv1,TLSv1.1,TLSv1.2");
. Cela ira aussi 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
Ajoutez ce paramètre à Java_OPTS ou à la ligne de commande dans maven: -Dhttps.protocols=TLSv1.2
System.setProperty("https.protocols", "TLSv1.2");
a travaillé dans mon cas. Avez-vous vérifié cela dans l'application?
Pour forcer l'activation de TLSv1.2 dans JRE7u_80, j'ai dû utiliser l'extrait de code suivant avant de créer une connexion JDBC.
import Java.security.NoSuchAlgorithmException;
import Java.security.Provider;
import javax.net.ssl.SSLContextSpi;
import Sun.security.jca.GetInstance;
import Sun.security.jca.ProviderList;
import Sun.security.jca.Providers;
public static void enableTLSv12ForMssqlJdbc() throws NoSuchAlgorithmException
{
ProviderList providerList = Providers.getProviderList();
GetInstance.Instance instance = GetInstance.getInstance("SSLContext", SSLContextSpi.class, "TLS");
for (Provider provider : providerList.providers())
{
if (provider == instance.provider)
{
provider.put("Alg.Alias.SSLContext.TLS", "TLSv1.2");
}
}
}
Capable de se connecter à Windows 10 avec le système d'exploitation activé pour SQL Server 2017 et TLSv1.2.
Les réponses citées sont correctes, mais je ne fais que partager un casse-tête supplémentaire qui s’applique à mon cas: en plus d’utiliser setProtocol
/withProtocol
, il se peut que certains pots désagréables ne disparaissent pas, le vieux:
<dependency>
<groupId>commons-httpclient</groupId>
<artifactId>commons-httpclient</artifactId>
<version>3.1</version>
</dependency>
<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étro-compatible, mais la plupart des bibliothèques ne le sont pas. Chaque jour qui passe, j'aimerais que les bibliothèques partagées soient mises hors la loi avec ce manque de responsabilité.
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 vous intéresser à la configuration qui contrôle l'implémentation TLS de la plate-forme sous-jacente via -Djdk.tls.client.protocols=TLSv1.2
.