Найбільш поширене використання аутентифікації на основі сертифіката X.509 — це перевірка автентичності сервера під час використання SSL-протоколу, найчастіше під час використання HTTPS з браузера. Браузер автоматично перевіряє, щоб сертифікат, представлений сервером, було видано (тобто, підписано цифровим підписом) одним із довірених центрів сертифікації, зазначених у списку, який він веде.

----------------------------------------

Найбільш поширене використання аутентифікації на основі сертифіката X.509 — це перевірка автентичності сервера під час використання SSL-протоколу, найчастіше при використанні HTTPS з браузера. Браузер автоматично перевіряє, щоб сертифікат, наданий сервером, було видано (тобто, підписано цифровим підписом) одним із довірених центрів сертифікації, зазначених у списку, який він веде.

Ти також можеш використовувати SSL-протокол із "взаємною автентифікацією"; і в цьому випадку сервер запитуватиме у клієнта дійсний сертифікат як елемент підтвердження встановлення зв'язку за протоколом SSL. Сервер аутентифікує клієнта, перевіряючи, щоб його сертифікат було підписано допустимим центром сертифікації. Якщо вказано дійсний сертифікат, його можна отримати через API сервлета в програмі. Модуль Spring Security для X.509 отримує сертифікат за допомогою фільтра. Він зіставляє сертифікат із користувачем програми та завантажує набір наданих повноважень цього користувача для використання зі стандартною інфраструктурою Spring Security.

Тобі слід ознайомитися з використанням сертифікатів та налаштуванням автентифікації клієнта для свого контейнера сервлетів, перш ніж намагатися використовувати його зі Spring Security. Основний обсяг роботи полягає у створенні та встановленні відповідних сертифікатів та ключів. Наприклад, якщо ти використовуєш Tomcat, прочитай інструкції тут https://tomcat. apache.org/tomcat-9.0-doc/ssl-howto.html. Важливо, щоб це належно працювало до того, як ти намагатимешся використовувати Spring Security.

Додати аутентифікацію на основі X.509 у свій вебдодаток

Активувати аутентифікацію клієнта на основі X.509 дуже просто. Потрібно лише додати елемент <x509/> у конфігурацію простору імен безпеки http.

<http>
...
<x509 subject-principal-regex="CN=(.*?)," user-service-ref="userService"/>;
</http>

Елемент має два необов'язкові атрибути:

  • subject-principal-regex. Регулярне вираження, яке використовується для вилучення імені користувача з імені суб'єкта сертифіката. Значення за замовчуванням наведено вище. Це ім'я користувача, яке буде передано UserDetailsService для завантаження повноважень користувача.

  • user-service-ref. Це ідентифікатор біна UserDetailsService, який використовуватиметься з X.509. Він не потрібен, якщо в контексті програми визначено лише один такий бін.

Subject-principal-regex має містити одну групу. Наприклад, стандартний вираз "CN=(.*?)" відповідає полю загального імені. Таким чином, якщо ім'я суб'єкта сертифікату має вигляд "CN=Jimi Hendrix, OU=...", ім'ям користувача буде "Jimi Hendrix". Зіставлення не враховує регістр. Таким чином, "emailAddress=(.*?)," буде відповідати "EMAILADDRESS=jimi@hendrix.org,CN=…" а ім'ям користувача в результаті буде "jimi@hendrix.org". Якщо клієнт пред'являє сертифікат, а дійсне ім'я користувача успішно вилучено, то в контексті безпеки повинен з'явитися допустимий об'єкт Authentication. Якщо сертифікат не було знайдено, або якщо не вдалося знайти відповідного користувача, контекст безпеки залишиться порожнім. Це означає, що ти легко можеш використовувати автентифікацію на основі X.509 з іншими варіантами, такими як вхід до системи на основі форм.

Налаштування протоколу SSL у Tomcat

У репозиторії зі зразками для Spring Security є кілька попередньо згенерованих сертифікатів. Можна використовувати їх для активації SSL-протоколу для тестування, якщо не хочеш генерувати власний. Файл server.jks містить сертифікат сервера, закритий ключ та сертифікат центру видачі сертифікатів. Також є кілька файлів клієнтських сертифікатів для користувачів зі зразків програм. Ти можеш встановити їх у свій браузер, щоб здійснювати аутентифікацію клієнта за протоколом SSL

Щоб запустити tomcat з підтримкою SSL-протоколу, помісти файл server.jks у каталог tomcat під назвою conf і додай наступний конектор у файл server.xml

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" scheme="https" secure="true"
clientAuth="true" sslProtocol="TLS"
keystoreFile="${catalina.home}/conf/server.jks"
keystoreType="JKS" keystorePass="password"
truststoreFile="${catalina.home}/conf/server.jks"
truststoreType="JKS" truststorePass="password"
/>

clientAuth можна також встановити в значення want, якщо потрібно, щоб з'єднання по SSL-протоколу були успішно встановлені, навіть якщо клієнт не пред'явив сертифікат. Клієнти, які не пред'явили сертифікат, не зможуть отримати доступ до об'єктів, захищених Spring Security, якщо ти не використовуєш механізм автентифікації, відмінний від X.509, наприклад, автентифікацію за формою.