Почему у меня возникает ошибка рукопожатия между клиентом TLS 1.0 и сервером SSL 3.0?

Существует проект, который широко использует JSSE.

В зависимости от параметра конфигурации SSLContext инициализируется для SSLv3. Это означает, что если параметр не установлен, он равен SSLv3, иначе — TLS.

Я иногда замечал некоторые сбои рукопожатия и отслеживал их: если клиент согласовывал TLS, а сервер отвечал SSLv3, рукопожатие не удалось.

Почему это происходит? Я думал, что TLS и SSLv3 в значительной степени взаимозаменяемы. Разве это не так? Если я перейду на сторону сервера, чтобы всегда отвечать TLS, есть ли шанс, что я что-то сломаю?


person Cratylus    schedule 26.03.2011    source источник
comment
Ваш код на стороне клиента или на стороне сервера?   -  person President James K. Polk    schedule 26.03.2011
comment
@GregS: я контролирую обе стороны. Но клиентская часть связывается и с другими https-серверами, кроме моего.   -  person Cratylus    schedule 27.03.2011


Ответы (2)


TLS 1.0 внутри — это SSL 3.1. Клиент и сервер могут согласиться использовать один или оба; во время рукопожатия клиент отправляет самую старшую известную ему версию протокола, а сервер должен выбрать самую старшую поддерживаемую им версию, которая не всегда новее, чем та, что была отправлена ​​клиентом.

Я предполагаю, что когда вы настраиваете свой клиент для использования TLS, клиент понимает это как «использовать только TLS 1.0»: клиент отправляет «3.1», и если сервер настроен на ответ « 3.0", то клиент вполне логично откажется от соединения.

Что вам нужно сделать, так это найти способ настроить сервер так, чтобы он принимал как 3.0 , так и 3.1, и, таким образом, использовать любую версию протокола, объявленную клиентом. В качестве альтернативы настройте клиент, чтобы объявить, что он знает 3.1, но так, чтобы он также принимал «понижение» до 3.0, если сервер так говорит.

person Thomas Pornin    schedule 28.03.2011
comment
Таким образом, SSL3.1 и 3.0 несовместимы. Это (обычно) конфигурация, т.е. настройка сервера для приема как 3.0, так и 3.1, или потребуется специальный код? - person Cratylus; 30.03.2011
comment
SSL 3.0 и 3.1 — это не совсем один и тот же протокол, но они имеют достаточную общую структуру, поэтому первое клиентское сообщение может работать для обоих, а затем сервер может принять решение. Обычно это вопрос конфигурации. Внутри это должно привести к вызову SSLServerSocket.setEnabledProtocols(), который принимает массив строк, что позволяет указать несколько протоколов (например, "SSLv3" и "TLSv1"). - person Thomas Pornin; 30.03.2011

Вы не говорите, чего вы пытаетесь достичь, изменяя параметр протокола. SSLv3 и TLS1.0 — очень похожие, но, тем не менее, разные протоколы. Механизм согласования протокола, представленный в SSLv3, также используется в последующих протоколах. Суть в том, что в SSLContext.getInstance("proto"); вы должны установить proto самую раннюю версию протокола SSL, которую вы готовы поддерживать. После этого одноранговые узлы будут договариваться об использовании новейшей версии протокола, которую они оба поддерживают.

person President James K. Polk    schedule 26.03.2011
comment
Изменяющийся параметр протокола используется как более строгое указание аутентификации. Он также используется в других частях (например, для использования более безопасных генераторов чисел и т. д.). Мой вопрос здесь заключается в том, почему не удается согласование между сервером, настроенным для TLS, и реализацией клиента, которая инициализирует SSLContext с помощью SSLv3? - person Cratylus; 27.03.2011