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.
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
Come si inizializza la variabile 'sslContext'? –
Ho aggiunto i dettagli che hai richiesto nella domanda – Manu