我们目前找不到使用 Java 代码通过 F5 BIG-IP 负载平衡器连接到 IIS 服务器(配置为相互身份验证)的方法,我们尝试了不同的 Java 版本和代码,它们都产生了相同的错误。
这是我们设置的:
- Java 客户端
- 一个 F5 BIG-IP 负载平衡器 - 配置为简单的 TCP 负载平衡,无 SSL 卸载,将端口 443 视为任何普通 TCP 端口以实现负载平衡目的
- 为相互身份验证配置的 IIS 服务器,它位于 F5 负载平衡器后面
这是我们尝试过的:
- 通过负载均衡器连接 Java 客户端时,出现“连接重置”异常
- Java客户端直接连接IIS服务器时没有问题,相互认证成功完成
- 然后我写了一个 C# 控制台应用程序并通过负载均衡器连接,没有问题,相互身份验证已成功完成
- 还尝试了 Postman、“openssl -s_client”命令、“curl”命令和浏览器,它们都通过 F5 负载均衡器成功工作
这是通过F5负载均衡器连接Java客户端时记录的SSL日志(最后几行),
upcoming handshake states: client finished[20]
upcoming handshake states: server change_cipher_spec[-1]
upcoming handshake states: server finished[20]
main, WRITE: TLSv1 Change Cipher Spec, length = 1
[Raw write]: length = 6
0000: 14 03 01 00 01 01 ......
*** Finished
verify_data: { 73, 224, 69, 18, 151, 153, 193, 139, 98, 147, 188, 146 }
***
update handshake state: finished[20]
upcoming handshake states: server change_cipher_spec[-1]
upcoming handshake states: server finished[20]
main, WRITE: TLSv1 Handshake, length = 16
Padded plaintext before ENCRYPTION: len = 48
0000: 14 00 00 0C 49 E0 45 12 97 99 C1 8B 62 93 BC 92 ....I.E.....b...
0010: 1D FC E6 70 EB 17 5C D7 CD 9A 3A A5 9D 48 55 59 ...p..\...:..HUY
0020: 62 FB F0 0E 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B b...............
[Raw write]: length = 53
0000: 16 03 01 00 30 27 77 7E 52 F6 3F 4D DB 5D 30 C0 ....0'w.R.?M.]0.
0010: 61 A4 A6 4A 9A 93 75 40 59 37 DB E3 8D DC C3 DC a..J..u@Y7......
0020: AB 1A 31 57 6A 98 6D 45 D7 43 04 2A A8 DE 7E D5 ..1Wj.mE.C.*....
0030: AF E9 D5 5A 5E ...Z^
main, handling exception: java.net.SocketException: Connection reset
%% Invalidated: [Session-2, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA]
main, SEND TLSv1 ALERT: fatal, description = unexpected_message
main, WRITE: TLSv1 Alert, length = 2
Padded plaintext before ENCRYPTION: len = 32
0000: 02 0A 1A 14 26 47 FC 57 B2 86 75 FC 32 13 76 07 ....&G.W..u.2.v.
0010: 9E DD 02 D6 29 73 09 09 09 09 09 09 09 09 09 09 ....)s..........
main, Exception sending alert: java.net.SocketException: Connection reset by peer: socket write error
main, called closeSocket()
Process finished with exit code 0
试过Java代码1
SocketFactory factory = SSLSocketFactory.getDefault();
String hostname = "test-efi.in.abcdefg.com";
int port = 443;
SSLSocket socket = (SSLSocket) factory.createSocket(hostname, port);
socket.startHandshake();
试过Java代码2
URL url = new URL("https://test-efi.in.abcdefg.com/InterfaceTest/api/FORM/CheckStatus?ID=123456");
conn = (HttpsURLConnection) url.openConnection();
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setRequestMethod("GET");
if (conn.getResponseCode() != 200) {
throw new RuntimeException("Failed : HTTP error code : " + conn.getResponseCode());
}
我的问题是,鉴于 C# 客户端、Postman、“openssl -s_client”命令、“curl”命令和浏览器都正常工作,您能否告知是否有办法让这个 Java 代码工作?谢谢。