Обновление JBoss до Spring Boot и Spring Security: проблемы аутентификации X509 - PullRequest
0 голосов
/ 20 марта 2020

ОБНОВЛЕНИЕ ИЗ: JBoss EAP 6.4 / Spring Security 4.2.1 (XML Конфигурация)

ОБНОВЛЕНИЕ: Spring Boot 2.2.4 / Spring Security 5.2.1 (JavaConfig)

У нас есть конечная точка REST, защищенная Spring Security, которая использует аутентификацию X509 и тестовый клиент.

I точка останова в Цепочка фильтров Spring Security в X509AuthenticationFilter.extractClientCertificate:

X509Certificate[] certs = (X509Certificate[]) request
        .getAttribute("javax.servlet.request.X509Certificate");

Я больше не вижу сертификат X509, встречающийся в Запросе после перехода к Spring Boot и Spring Security 5.2 JavaConfig.

Не опубликовал исходный код, потому что я не ожидаю, что кто-нибудь исправит мою проблему ... Я просто ищу несколько предложений о том, где копать или возможные пути для изучения. Некоторые мысли ...

  1. Использует ли Spring Security в Spring Boot встроенные коннекторы Tomcat? Если у меня есть Tomcat Connector для HTTPS, и клиент обращается к нам по HTTPS, нужно ли мне как-то сказать Tomcat Connector для HTTPS, чтобы извлечь сертификат X509 из запроса?
  2. Как или что помещает сертификат X509 в Запрос с атрибутом javax.servlet.request.X509Certificate? Я отлаживал против старого (работающего) приложения JBoss EAP и никогда не мог понять, как он попал в Запрос, только потому, что он был там, когда я остановился в Spring Security в X509AuthenticationFilter.

1 Ответ

0 голосов
/ 23 марта 2020

Если кто-нибудь когда-нибудь сталкивался с этим ... Я решил это и буду рад ответить на вопросы, если это поможет другим.

Оказывается, проблема не в Spring Security, а в том, как мы настроили коннекторы Tomcat.

Нам нужно было:

  1. Правильно настройте хранилище доверенных сертификатов для Spring Boot Tomcat Secure Connector, используя приведенные ниже вызовы методов, совместимые с org.apache.coyote.http11.Http11NioProtocol.

  2. Также (и это важно) - установите для свойства "ClientAuth "значение" правда".

Ужасно, я копался в исходном коде для Tomcat-embed-core, но есть ряд строк, которые эквивалентны «заставляют клиента отправлять сертификат как часть Запрос". Это следующие строки: «true», «yes», «require», «required». Они все делают одно и то же, поэтому мы просто использовали «истину».

    protocol.setTruststoreFile(truststorePath); // local directory path
    protocol.setTruststoreType(truststoreType); // a string of either PKCS12 or JKS
    protocol.setTruststorePass(truststorePass); // whatever password you set on your Keystore
    protocol.setClientAuth("true"); // Makes the client provide cert in Request over HTTPS

Соединители Tomcat плохо документированы. Есть вызов метода:

protocol.setSSLCACertificateFile(trustStorePath);

, который ничего не делает при org.apache.coyote.http11.Http11NioProtocol.

Очевидно, он предназначен для работы с org.apache.coyote.http11.Http11AprProtocol (Apache Portable Runtime). Для нас это была красная селедка, мы вызывали этот метод, но на самом деле он не настраивал наше хранилище доверенных сертификатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...