Применение двухстороннего SSL в клиентах Java CXF - PullRequest
0 голосов
/ 19 декабря 2018

Двухсторонний SSL - или взаимная аутентификация - обычно диктуется сервером в HTTPS.Например, в этом руководстве объясняется, как настроить сервер приложений WildFly, чтобы клиенты веб-сервисов предъявляли сертификат во время связи.

Однако в нашем случае нам нужно включить двусторонний SSL нана стороне клиента.Это означает, что наш клиент настроен с сертификатом клиента, чтобы он мог предоставить сертификат во время рукопожатия.Если сервер, к которому мы подключаемся, не запрашивает сертификат, мы хотим прервать связь.

Описание рукопожатия SSL, например, схема в разделе «Протокол SSL» здесь (чуть дальше) объясните, как в первую очередь происходит выбор набора шифров:

"1. Client hello - клиент отправляет информацию о сервере, включая самую высокую версию SSL, которую он поддерживает, исписок поддерживаемых наборов шифров (TLS 1.0 обозначен как SSL 3.1.) Информация набора шифров включает в себя криптографические алгоритмы и размеры ключей. "

На стороне Java (более конкретно: CXF в моем случае) можно фильтровать наборы шифров ( "cipherSuitesFilter" ) - поэтому я подумал, что можно ограничить наборы шифров теми, которые требуют взаимной аутентификации.Но я не нахожу никаких связей между комплектами шифров и двусторонним SSL.Например, эта страница примечания:

алгоритм аутентификации - определяет, как будет выполняться аутентификация сервера и (при необходимости) аутентификация клиента.

Я начинаю думать, что это означает, что набор шифров только диктует как аутентификация клиента, а не , если аутентификация клиента требуется.

Это оставляет меня в тупикеконец.Есть ли другой способ принудительной аутентификации клиента на стороне клиента?

В настоящее время единственное решение, о котором я могу подумать, - это найти правильный способ подключения для связи SSL после установления связи, проверяя,соединение использует аутентификацию клиента и прерывание, если это не так.Но я бы хотел использовать любой общий подход, если такая вещь существует.

1 Ответ

0 голосов
/ 30 апреля 2019

Мы не нашли лучшего решения, чем то, которое я уже упоминал в своем вопросе.Как клиент, мы можем только проверить, было ли установлено соединение, используя сертификат клиента.Это не гарантирует, что сервер полностью проверил сертификат, просто он запросил сертификат.

Наша реализация - это пользовательский javax.net.ssl.SSLSocketFactory, который расширяет createSocket методы, чтобы проверить, возвращает ли javax.net.ssl.SSLSession.getLocalCertificates() что-то.Если нет, то исключаемый подкласс javax.net.ssl.SSLException генерируется для прерывания связи.Заводская розетка устанавливается через org.apache.cxf.configuration.jsse.TLSClientParameters.setSSLSocketFactory(SSLSocketFactory).

...