Habilite o TLS 1.1 e 1.2 para clientes no Java 7


50

O Java 7 desativa o TLS 1.1 e 1.2 para clientes. Da arquitetura de criptografia Java Documentação dos provedores Oracle :

Embora o SunJSSE na liberação Java SE 7 suporte TLS 1.1 e TLS 1.2, nenhuma versão é ativada por padrão para conexões do cliente. Alguns servidores não implementam a compatibilidade direta corretamente e se recusam a conversar com os clientes TLS 1.1 ou TLS 1.2. Para interoperabilidade, o SunJSSE não habilita o TLS 1.1 ou TLS 1.2 por padrão para conexões do cliente.

Estou interessado em habilitar os protocolos em uma configuração geral do sistema (talvez por meio de um arquivo de configuração), e não em uma solução por aplicativo Java.

Como habilito administrativamente o TLS 1.1 e 1.2 em todo o sistema ?

Nota : desde POODLE, eu gostaria de desativar administrativamente o sistema SSLv3. (Os problemas com o SSLv3 são anteriores ao POODLE há pelo menos 15 anos, mas o Java / Oracle / Developers não respeitava as práticas recomendadas básicas, para que usuários como você e eu ficassem limpando a bagunça).


Aqui está a versão 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)

A única coisa que funcionou para mim foi definir o padrão SSLContext como descrito aqui: stackoverflow.com/questions/39157422/...
shmert

Respostas:


31

Você pode simplesmente adicionar a propriedade a seguir, -Dhttps.protocols=TLSv1.1,TLSv1.2que configura a JVM para especificar qual versão do protocolo TLS deve ser usada durante as conexões https.


6
Por favor, explique mais sobre o que isso faz. Caso contrário, isso é vago e potencialmente prejudicial nas mãos erradas.
studiohack

1
@Thomasz - Eu meio que concordo com os outros aqui ... Como faço isso administrativamente em todo o sistema? Ele é adicionado ao arquivo de configuração de uma máquina? Em caso afirmativo, qual é o arquivo e onde o adiciono?
JWW

3
talvez este link ajude: blogs.oracle.com/java-platform-group/entry/… você pode adicionar a propriedade -Dhttps.protocols como um parâmetro no exemplo da linha de comandos: java -jar yourapplication.jar -Dhttps.protocols = TLSv1 .2 ou em algum lugar dos arquivos de configuração do aplicativo (servidor). Você pode verificar se funciona adicionando parâmetros adicionais: -Djavax.net.debug = all depois disso, quando o aplicativo negociar a conexão https, ele imprimirá todas as informações de negociação, incluindo a versão do protocolo que foi usada
Tomasz Rebizant

Este parâmetro (https.protocols) está configurando a máquina virtual java, cuja versão do protocolo deve ser usada durante a conexão https.
Tomasz Rebizant

3
@TomaszRebizant, sim, você está correto. Por exemplo, adicionar export JAVA_OPTS="-Dhttps.protocols=TLSv1.1,TLSv1.2"o setenv.sh do Tomcat habilita o TLSv1 e o TLSv2 para todas as conexões SSL feitas a partir de aplicativos no servidor de aplicativos.
Zaki

14

Você pode tentar adicionar algo como o seguinte ao script de inicialização, assumindo o 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"

Algumas outras sugestões: https://blogs.oracle.com/java-platform-group/entry/java_8_will_use_tls


onde você encontrou a documentação dessas propriedades, não vejo em nenhum lugar elas mencionadas nos documentos JAVA7 para "-D deployment.security. {ProtocolName} = True / False;"
runcode 22/10

@runcode, não exatamente, mas isso é mencionado no blog oracle.com mencionado acima
cnst

1
@cnst - o problema aqui é que preciso entrar em contato com todos os desenvolvedores de todos os softwares Java e pedir que eles façam isso. Daí a razão de eu querer fazer isso administrativamente uma vez na minha máquina.
JWW

Não funcionou para mim.
Sridhar Sarnobat

9

No Java 7 no Mac OS X, você acessa System Preferences > Javae o Java Control Panel é aberto em uma janela separada. Então você vai para a Advancedguia, role para baixo até a Advanced Security Settingsseção e marque as caixas de seleção Use TLS 1.1e Use TLS 1.2.

insira a descrição da imagem aqui


Obrigado Spiff. Já estou configurado para o TLS 1.0 e superior, como você mostrou. No entanto, quando eu crio um SSLSocket(e presumo que isso aconteça com outros programas Java), o TLS 1.0 está ativado (e o TLS 1.1 e 1.2 estão disponíveis).
JWW

3
Você também pode testar isso no seu sistema (se estiver interessado). Baixar ProtocolTest.java a partir deste relatório de bug e executá-lo. Para compilar e executar, execute javac ProtocolTest.java && java ProtocolTestem um terminal. Veja o que aparece em Protocolos ativados .
JWW

2
Isso funciona apenas para Applets e clientes WebStart. Não afeta os servidores de aplicativos iniciados com o executável java.
Eckes

8

Eu pesquisei isso recentemente e quero adicionar - isso não funcionará para o JDK, o deployment.properties relevante apenas para Applets e outras coisas em execução no JRE.

para aplicativos JDK (um servidor que precisa se conectar ao LDAP, por exemplo), o servidor é um cliente, mas o deployment.security. não funcionaria.

nenhuma maneira de alterá-lo, a menos que você escreva algum código como SSLContext.getInstance ("TLSv1.2");


4

Parece que as configurações de deployment.security. * Funcionam para os Java Applets e os programas Java Web Start em execução em uma área de trabalho. Como outras pessoas mencionam aqui, você pode editar deployment.properties para especificar isso.

Aqui está um artigo que mostra como usar uma política de grupo para implantar o mesmo arquivo deployment.properties para todos os usuários: http://www.darkoperator.com/blog/2013/1/12/pushing-security-configuration-for- java-7-update-10-via-gpo.html

Infelizmente, não há como ativar isso em todos os programas java em um computador que chame diretamente java.exe ou javaw.exe. Você precisa encontrar cada programa que usa java, encontrar o arquivo de configuração onde especifica os parâmetros a serem passados ​​para java e alterá-lo.

Para Tomcat tivemos que passar isso para que as conexões do Tomcat para outros servidores usar TLS 1.1+: -Dhttps.protocols=TLSv1.1,TLSv1.2. No Linux, isso pode ser feito editando bin/catalina.shou criando bin/setenv.sh.

Não sei o que é preciso para fazer o Tomcat usar apenas o TLS 1.2 no lado do servidor. Nós enfrentamos o Apache HTTP.


1

Se você estiver com o Java 7, poderá adicionar -Djdk.tls.client.protocols=TLSv1.1,TLSv1.2aos argumentos da JVM.

Observe que isso tem várias ressalvas:

Apesar dessas deficiências, acho que isso pode ser útil, especialmente quando o protocolo em que se interessa usa TLS, mas não é HTTPS, por exemplo, LDAPS.

[ATUALIZAÇÃO] Na minha empresa, que executa seu pool de servidores no Ubuntu, percebemos que nem a atualização 121 do OpenJDK 7 era suficiente para implementar isso corretamente. Atualizamos todos os servidores para atualizar 181 antes que funcionasse.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.