Ошибка EOFException при установлении соединения SSL
Я пишу программу на Java, которая отправляет официальную информацию о счетах в налоговую администрацию. Эта общедоступная служба предоставляла сертификаты для использования в соединении SSL с веб-службами и для шифрования некоторых специальных полей данных внутри сообщения тела запроса.
У меня возникает ошибка EOFException на этапе установления связи после того, как клиент и сервер согласились обмениваться данными с использованием согласованного набора шифров, который в данном случае является TLS_RSA_WITH_AES_128_CBC_SHA.
Следуя протоколу SSL, клиент успешно выполняет тест с использованием нового шифра и отправляет тестовые данные на сервер, чтобы сервер также мог повторить тот же тест и подтвердить, что он также способен шифровать и дешифровать данные. И в этот момент сервер отправляет EOFException.
Вот последняя часть журнала связи SSL:
Отправьте на сервер быстрое подтверждение, подтверждающее, что мы знаем закрытый ключ, соответствующий только что отправленному клиентскому сертификату...
* CertificateVerify
[запись] MD5 и SHA1 хэши: len = 262
двоичные данные здесь слишком велики, не отображаются
основной, НАПИШИТЕ: TLSv1 Рукопожатие, длина = 262
[Raw write]: длина = 267
двоичные данные здесь слишком велики, не отображаются
* Сообщите серверу, что мы переходим на недавно установленный набор шифров. Все дальнейшие сообщения будут зашифрованы с использованием только что установленных нами параметров. *
main, WRITE: TLSv1 Изменить спецификацию шифра, длина = 1
[Raw write]: длина = 6
0000: 14 03 01 00 01 01
... и заканчивается успешно
..Законченный
Мы отправляем зашифрованное сообщение Готово, чтобы убедиться, что все работает.
verify_data: {221, 96, 47, 110, 19, 170, 244, 8, 37, 152, 160, 40}
... клиент зашифровывает тестовые данные..
[запись] MD5 и SHA1 хэши: len = 16
0000: 14 00 00 0C DD 60 2F 6E 13 AA F4 08 25 98 A0 28..... `/ n....%.. (
Мягкий открытый текст перед шифрованием: len = 48
0000: 14 00 00 0C DD 60 2F 6E 13 AA F4 08 25 98 A0 28..... `/ n....%.. (
0010: 10 7F 85 11 EC 6D 5D ED 21 70 27 F4 DC 23 C0 9B..... м].! P '.. #..
0020: A7 6F C2 80 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B.o..............
основной, НАПИШИТЕ: TLSv1 Рукопожатие, длина = 48
*... и отправить тестовые данные на сервер, чтобы сервер мог выполнить тот же тест и подтвердить, что зашифрованная связь может быть установлена (53 байта = 48 из тестовых данных + 5 из заголовка) *
[Raw write]: длина = 53
0000: 16 03 01 00 30 1C 17 08 0F 49 C9 6A 7A 8B 8C 48.... 0.... I.jz..H
0010: BA 57 2D CB 06 46 1E 65 61 7C 5F 74 F2 08 AB 12.W -.. F.ea._t....
0020: 91 47 72 8C 8F 84 0A CB D7 29 E2 FD 84 B2 FD 9E.Gr......)......
0030: 47 DC 13 60 B4 G..`.
... и сервер отвечает ошибкой EOFException
основное, полученное EOFException: ошибка
main, обработка исключения: javax.net.ssl.SSLHandshakeException: удаленный хост закрыт
соединение во время рукопожатия
%% Invalidated: [Session-1, TLS_RSA_WITH_AES_128_CBC_SHA]
main, ОТПРАВИТЬ TLSv1 ALERT: фатально, description = handshake_failure
Мягкий открытый текст перед шифрованием: len = 32
0000: 02 28 до н.э. 65 1A CA 68 87 79 84 5F 64 16 F5 28 72 .(. E..hy_d.. (r
0010: F7 8A 69 72 93 D8 09 09 09 09 09 09 09 09 09 09 09..ir............
основной, WRITE: TLSv1 Alert, длина = 32
[Raw write]: длина = 37
0000: 15 03 01 00 20 0D 9A 35 18 B7 98 4B 7B AF 82 4E......5... K... N
0010: 1A EE 7D AC 5D D5 49 05 4E 74 B9 77 E4 CD 87 61....]. I.Nt.w... a
0020: 23 03 5C 9C 7E #...
main, называется closeSocket ()
main, называется close ()
main, называется closeInternal(true)
Я понятия не имею, что может быть причиной такой неудачи и как программно повлиять на результат этого шага в процессе. Я попытался принудительно использовать другие шифры, распознаваемые как клиентом, так и сервером, такие как SSL_RSA_WITH_RC4_128_MD5, но ошибка осталась. Есть мысли о том, как решить эту проблему?
1 ответ
Есть мысли о том, как решить эту проблему?
Я предлагаю вам связаться с людьми, которые запускают эту службу, и попросить их просмотреть свои журналы, чтобы понять, почему их сервер закрывает соединение во время настройки SSL.
(Строго говоря, сервер не "отвечает с ошибкой [a] EOFException". Он фактически закрывает соединение TCP, и клиентские библиотеки Java выдают исключение. Вы, вероятно, получите более полезный ответ от сопровождающих услуга, если вы используете правильную терминологию.)