2016-06-14 27 views
6

Sono abbastanza nuovo per SSL e sono stato colpito da quello che sembra un problema noto. La mia applicazione è il client SSL e richiama un altro componente abilitato per SSL a due vie. I certificati in entrambi i componenti sono corretti e la connessione funziona bene a volte. Ogni server ha il proprio certificato server e la propria chiave privata, ma lo stesso certificato radice e intermedio.è limitata durante la rinegoziazione per TLS_1.2 con Java 8

Il controllo SSL in Server viene eseguito in Apache SW LB.

                  |-------------| 
                     /| Tomcat1 | 
                 |-------------|/|-------------| 
              |---------->|Apache SW LB |/ 
              |   |-------------|\  
              |       \ 
              |       \ |-------------| 
|-----------|   |------------|  |        | Tomcat 2 | 
|SSL Client |---HTTPS--->|Hardware LB |------|        |-------------|  
|-----------|   |------------|  |        |-------------| 
              |       /| Tomcat3 | 
              |   |-------------|/|-------------| 
              |---------->|Apache SW LB |/ 
                 |-------------|\ 
                     \ 
                      \|-------------| 
                      | Tomcat4 | 
                      |-------------| 

A volte sto ottenendo un errore come di seguito: -

*** 
%% Invalidated: [Session-10, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256] 
http-nio-8443-exec-10, SEND TLSv1.2 ALERT: fatal, description = bad_certificate 
http-nio-8443-exec-10, WRITE: TLSv1.2 Alert, length = 2 
[Raw write]: length = 7 
0000: 15 03 03 00 02 02 2A        ......* 
http-nio-8443-exec-10, called closeSocket() 
http-nio-8443-exec-10, handling exception: javax.net.ssl.SSLHandshakeException: server certificate change is restricted during renegotiation 

Sto usando template primavera REST per invocare la chiamata REST e utilizzando solo TLS_V1.2, ma ancora ottenere l'errore precedente.

TrustStrategy ts = new TrustStrategy() { 
     @Override 
     public boolean isTrusted(
      X509Certificate[] x509Certificates, String s) 
      throws CertificateException { 
     return true; // TODO : revisit 
     } 
    }; 
    SSLContext sslcontext = org.apache.http.ssl.SSLContexts.custom() 
     .loadKeyMaterial(keyStore, keypass.toCharArray()) 
     .loadTrustMaterial(trustStore, ts) 
     .build(); 

SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(

      sslcontext, new String[] { 
       "TLSv1.2" }, null, 
      SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); 
     return HttpClients.custom().setSSLSocketFactory(sslsf).build(); 

     } 

ON googling ho trovato così la questione non sarà happeneing per TLSv1.2 e Java 8 (versione java "1.8.0_60"). Sto usando Spring 4 RestTemplet per invocare le chiamate di riposo.

e sto usando la versione di sotto di httpclinet: -

<dependency> 
     <groupId>org.apache.httpcomponents</groupId> 
     <artifactId>httpclient</artifactId> 
     <version>4.4.1</version> 
    </dependency> 

Dato che io sono nuovo di SSL, ho alcune domande per iniziare: -

1). Si tratta di un problema SSL clinet o server SSL?

2). Qualche vero motivo per cui la connessione funziona a volte e si interrompe prima o poi? La ragione tecnica del fallimento.

3). È questo a che fare con qualsiasi memorizzazione nella cache sul lato client

Inoltre, sarebbe bello se qualcuno potesse indicare la vera soluzione per questo problema.

+0

Su goolging quello che posso trovare è che con Java Runtime Environment Java (TM) SE (build 1.8.0_60-b27) e httpClient 4.4.1 non dovremmo ottenere questo errore.Ma sto ancora ottenendo questo .. – Manu

+0

Come si inizializza la variabile 'sslContext'? –

+0

Ho aggiunto i dettagli che hai richiesto nella domanda – Manu

risposta

2

Lo stack SSL Java rifiuta la rinegoziazione probabilmente dopo che il loadbalancer hardware ha cambiato la connessione da un nodo all'altro.

Affinché una tale implementazione funzioni, entrambe le istanze "Apache SW LB" devono utilizzare lo stesso stesso URL dell'host virtuale e le configurazioni SSL dello stesso. E non c'è una ragione ovvia per non farlo, in quanto non è in conflitto con alcuna configurazione di sistema.

Quindi il problema è un misto tra un comportamento client che rifiuta la distribuzione del cluster per cui ogni nodo utilizza un certificato di chiave/server privato diverso, anche se l'URL dell'host virtuale è lo stesso.

+0

Sì. Hai ragione quando è il momento in cui il bilanciamento del carico F5 invia la richiesta al secondo nodo in cui si verifica l'errore. L'URL che il client sta colpendo è il bilanciamento del carico dell'hardware F5. Intendo dire che l'IP specificato nell'URL REST è il bilanciatore del carico F5. c'è qualcosa di specifico nel bilanciamento del carico Apache che può causare questo problema. La ragione logica alla base di questo è che lo stesso resto è in grado di interagire con altri componenti dietro il bilanciamento del carico F5 senza problemi. L'unica differenza di motivo è il Load Balancer di Apache tra ... – Manu

+0

Usi F5 BigIP? Perché non impostarlo come terminazione SSL e bilanciare direttamente il carico con il traffico HTTP verso i nodi Tomcat? Sarebbe molto più facile, affidabile e persino migliore per le prestazioni che rimuovono gli intermedi Apache. –

+0

Probabilmente altri componenti menzionati hanno un traffico inferiore o tempi di risposta più rapidi, senza innalzare le condizioni che attivano F5 per passare le connessioni ad altri nodi. –

Problemi correlati