2015-10-12 12 views
10
Server: 
TLS Version: v1.2 
Cipher Suite: TLS_RSA_WITH_AES_256_CBC_SHA256 

Client: 
JRE 1.7 

sto ricevendo l'errore sotto quando provo a connettersi al server dal client tramite SSL direttamente:Abilita TLSv1.2 e TLS_RSA_WITH_AES_256_CBC_SHA256 Cipher Suite

Caused by: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure 
     at sun.security.ssl.Alerts.getSSLException(Alerts.java:192) 
     at sun.security.ssl.Alerts.getSSLException(Alerts.java:154) 

Il codice di seguito consente TLSv1.2

Set<String> enabledTLSSet = new HashSet<String>(Arrays.asList(sslsocket.getEnabledProtocols())); 
    enabledTLSSet.add("TLSv1.2");  
    sslsocket.setEnabledProtocols(enabledTLSSet.toArray(new String[enabledTLSSet.size()])); 

Il codice di seguito consente TLS_RSA_WITH_AES_256_CBC_SHA256 Cipher Suite:

Set<String> enabledCipherSuitesSet = new HashSet<String>(Arrays.asList(sslsocket.getEnabledCipherSuites())); 
     enabledCipherSuitesSet.add("TLS_RSA_WITH_AES_256_CBC_SHA256"); 
     sslsocket.setEnabledCipherSuites(enabledCipherSuitesSet.toArray(new String[enabledCipherSuitesSet.size()])); 

Dopo aver eseguito entrambi i suddetti dal codice Java, sono in grado di connettersi al server correttamente tramite SSL.

E 'possibile abilitare/forzare TLSv1.2 e TLS_RSA_WITH_AES_256_CBC_SHA256 in Java 7 senza modificare alcun codice Java tramite proprietà, parametri o oggetti di debug?

Ho provato tutte le proprietà sottostanti in tutte le forme e combinazioni (abilitazione e disabilitazione) e non riuscito.

-Dhttps.protocols=TLSv1.2 
-Dhttps.cipherSuites=TLS_RSA_WITH_AES_256_CBC_SHA256 
-Ddeployment.security.TLSv1.2=true 

sto eseguendo il programma simile a quello qui sotto:

java -jar -Dhttps.protocols=TLSv1.2 -Dhttps.cipherSuites=TLS_RSA_WITH_AES_256_CBC_SHA256 Ddeployment.security.TLSv1.2=true -Djavax.net.debug=ssl:handshake SSLPoker.jar <SERVER> 443 

SSLPoker contiene il codice qui sotto:

package com.ashok.ssl; 

import javax.net.ssl.SSLSocket; 
import javax.net.ssl.SSLSocketFactory; 
import java.io.*; 

/** 
* Establish a SSL connection to a host and port, writes a byte and prints the response - Ashok Goli. See 
* http://confluence.atlassian.com/display/JIRA/Connecting+to+SSL+services 
*/ 
public class SSLPoke { 

    /** 
    * The main method. 
    * Usage: $java -jar SSLPoker.jar <host> <port> 
    * 
    * @param args the arguments 
    */ 
    public static void main(String[] args) { 
    if (args.length != 2) { 
     System.out.println("Usage: " + SSLPoke.class.getName() + " <host> <port>"); 
     System.exit(1); 
    } 
    try { 
     SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault(); 
     SSLSocket sslsocket = 
      (SSLSocket) sslsocketfactory.createSocket(args[0], Integer.parseInt(args[1])); 

     InputStream in = sslsocket.getInputStream(); 
     OutputStream out = sslsocket.getOutputStream(); 

     // Write a test byte to get a reaction :) 
     out.write(1); 

     while (in.available() > 0) { 
     System.out.print(in.read()); 
     } 
     System.out.println("Successfully connected"); 

    } catch (Exception exception) { 
     exception.printStackTrace(); 
    } 
    } 
} 

Tutti gli indicatori come raggiungere questo obiettivo senza modifiche al codice Java sarebbe essere molto apprezzato

+0

Non è possibile aggiungere suite di crittografia TLS senza aggiungere un intero fornitore di sicurezza, come Bouncy Castle, che in effetti potrebbe supportare quello. – EJP

+0

Quali sono le impostazioni con le quali ho bisogno di giocare per raggiungere questo obiettivo? –

+0

Ho aggiunto TLS e connesso correttamente al server con il codice sopra. Sto solo cercando un modo per farlo tramite la configurazione. –

risposta

10

E 'possibile solo se si utilizza una semplice connessione HTTPS (non Sockets SSL) utilizzando le proprietà

-Dhttps.protocols=TLSv1.2 
-Dhttps.cipherSuites=TLS_RSA_WITH_AES_256_CBC_SHA256 

Vedi il post a http://fsanglier.blogspot.com.es/

Java 7 ha introdotto il supporto per TLS v1.2 (fare riferimento a http://docs.oracle.com/javase/7/docs/technotes/guides/security/enhancements-7.html) BUT non lo abilita di default. In altre parole, l'app client deve specificare esplicitamente "TLS v1.2" alla creazione di SSLContext o altrimenti non sarà in grado di utilizzarlo.

Se è necessario utilizzare il protocollo presa direttamente sicuro, creare uno SSLContext "TLSv1.2" all'avvio dell'applicazione e utilizzare lo SSLContext.setDefault (CTX) chiamata per registrare tale nuovo contesto, come quello di default.

SSLContext context = SSLContext.getInstance("TLSv1.2"); 
SSLContext.setDefault(context); 
+0

Wow ... Questo è davvero necessario. Ho notato che sono stati ignorati, ma non mi aspettavo che il server richiedesse già TLS 1.2 – Kukeltje

3

I JRE disabilitano di default tutte le crittografie a 256 bit. Per abilitare è possibile scaricare (Java Cryptography Extension JCE) Politica forza illimitata giurisdizione Files qui: http://www.oracle.com/technetwork/java/javase/downloads/index.html

Sostituire la local_policy.jar e US_export_policy.jar file vasetti nel vostro lib/security nella directory JRE.

+0

Questo ha funzionato perfettamente nel mio caso. –

1

Sembra che l'attuale azienda di JRE sia i file di criteri limitati e illimitati nella cartella di installazione di JRE in lib/security, ciascuno in sottocartelle separate. Per impostazione predefinita, in lib/security/java.security, la politica limited viene utilizzata per impostazione predefinita. Ma se si disapprova la riga crypto.policy=unlimited, ciò consentirà a Java di utilizzare i file di politica unlimited e di abilitare le crittografie/algoritmi a 256 bit.

Problemi correlati