Клиент Java получает "сброс соединения" во время SSL-квитирования с сервером IIS через F5 BIG-IP-балансировщик нагрузки

В настоящее время мы не можем найти подход к использованию кода Java для подключения к серверу IIS (настроенному как взаимная аутентификация) через балансировщик нагрузки B5-IP F5, мы пробовали разные версии и код Java, все они выдавали одну и ту же ошибку.

Вот что мы создали:

  • клиент Java
  • балансировщик нагрузки B5-IP F5 - настроен как простая балансировка нагрузки TCP, без разгрузки SSL, рассматривая порт 443 как любые обычные порты TCP для балансировки нагрузки
  • сервер IIS, настроенный для взаимной аутентификации, он сидит за балансировщиком нагрузки F5

Вот что мы попробовали:

  • при подключении клиента Java через балансировщик нагрузки возникло исключение "сброс подключения"
  • при прямом подключении клиента Java к серверу IIS проблемы не возникало, и взаимная проверка подлинности успешно завершена
  • Затем я написал консольное приложение на C# и подключился через балансировщик нагрузки, проблем не было, и взаимная проверка подлинности успешно завершена.
  • также попробовал Postman, команду "openssl -s_client", команду "curl" и браузеры, все они успешно работают через балансировщик нагрузки F5

Вот журнал SSL (последние несколько строк), записанный при подключении клиента Java через балансировщик нагрузки F5,

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-код работать? Благодарю.

1 ответ

Попробуйте другую версию Java. У меня была похожая проблема и та же ошибка. Все работало хорошо на машине с Java 1.8.0_161, но не работало на машине с Java 1.8.0_171. Итак, я переустановил Java на плохой машине (понизил ее), и она начала работать хорошо.

Другие вопросы по тегам