Man*_*anu 6 java apache ssl spring tomcat
我对SSL很陌生,并且被看似已知的问题所困扰.我的应用程序是SSL客户端,并调用另一个为双向SSL启用的组件.两个组件中的证书都是正确的,有时连接工作正常.每个服务器都有自己的服务器证书和私钥,但具有相同的根证书和中间证书.
服务器中的SSL检查在Apache SW LB中完成.
|-------------|
/ | Tomcat1 |
|-------------| / |-------------|
|---------->|Apache SW LB |/
| |-------------|\
| \
| \ |-------------|
|-----------| |------------| | | Tomcat 2 |
|SSL Client |---HTTPS--->|Hardware LB |------| |-------------|
|-----------| |------------| | |-------------|
| / | Tomcat3 |
| |-------------| / |-------------|
|---------->|Apache SW LB |/
|-------------|\
\
\|-------------|
| Tomcat4 |
|-------------|
Run Code Online (Sandbox Code Playgroud)
有时我会收到如下错误: -
***
%% 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
Run Code Online (Sandbox Code Playgroud)
我使用Spring REST模板来调用REST调用并仅使用TLS_V1.2,但仍然遇到上述错误.
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();
}
Run Code Online (Sandbox Code Playgroud)
在谷歌搜索我发现这个问题将不会发生在TLSv1.2和Java 8(java版"1.8.0_60").我正在使用Spring 4 RestTemplete来调用其余的调用.
我正在使用以下版本的httpclinet: -
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.4.1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
由于我是SSL的新手,我几乎没有问题: -
1).这是SSL clinet还是SSL服务器问题?
2).有时候连接工作并且有时会破坏的任何真正原因?失败的技术原因.
3).这与客户端的任何缓存有关
如果有人可以指出真正的问题,这也很棒.
在硬件负载平衡器将连接从一个节点切换到另一节点后,Java SSL 堆栈可能会拒绝重新协商。
为了使此类部署正常工作,两个“Apache SW LB”实例必须使用完全相同的虚拟主机 URL 和 SSL 配置。并且没有明显的理由不这样做,因为它不与任何系统配置冲突。
因此,您的问题是客户端行为混合拒绝集群部署,每个节点使用不同的私钥/服务器证书,即使虚拟主机 URL 相同。
归档时间: |
|
查看次数: |
3484 次 |
最近记录: |