Я реализую взаимную аутентификацию между одним клиентским приложением (CLIENT) и моим приложением Spring Boot 2 (SERVER). Я понимаю, что шаги должны быть следующими:
Сервер создает хранилище ключей и хранилище доверенных сертификатов. Хранилище ключей, используемое для хранения сертификатов сервера и закрытого ключа. Склад доверенных сертификатов, используемый для хранения других учетных данных (сертификатов от центра сертификации (ЦС) или сертификатов доверенных клиентов).
Для сервера создается CSR, который затем передается в CA. CA генерирует подписанный сертификат из CSR. Он установлен в хранилище ключей сервера.
- Клиент (у которого есть собственное хранилище ключей и хранилище доверенных сертификатов) предоставляет свой открытый ключ серверу. Затем он устанавливается в хранилище доверенных сертификатов сервера.
Когда от клиента к серверу отправляется https-запрос:
- Клиент делает запрос на доступ к защищенному ресурсу.
- Сервер отвечает своим публичным сертификатом.
- Клиент проверяет этот сертификат (смотрит в хранилище доверенных сертификатов и проверяет, подписан ли он доверенным центром сертификации).
- Клиент представляет свой публичный сертификат серверу.
- Затем сервер проверяет сертификат по своему хранилищу доверенных сертификатов.
- Предполагая, что проверка прошла успешно, клиенту предоставлен доступ к защищенному ресурсу.
Итак, у меня есть несколько вещей, которые меня немного смущают ...
- Правильны ли в общих чертах описанные выше шаги?
- Как сервер проверяет сертификат клиента? (Я думаю, что он просматривает хранилище доверенных сертификатов для этого сертификата, но не уверен, что на самом деле происходит после этого).
- Я видел примеры установки сертификата CA в хранилище доверенных сертификатов сервера вместо фактического общедоступного сертификата клиента ~ есть ли вариант использования, когда это следует или не следует делать? Для моего варианта использования мне был предоставлен подписанный сертификат от клиента (третьей стороны). ЦС, подписавший этот сертификат, отличается от ЦС, подписавшего сертификат сервера.
- Действительно ли этот процесс аутентифицирует клиента, то есть этот клиент теперь может иметь доступ к защищенным ресурсам сервера, но другой клиент, который может представить другой сертификат, не будет иметь доступа? (например, более безопасный метод предоставления имени пользователя и пароля)
- При чем тут проверка общего имени (CN)? Я отмечаю, что в Spring Boot X.509 вы можете получить имя пользователя из CN, а затем использовать его для поиска соответствующих сведений о пользователе в службе сведений о пользователях.
- Если сертификат клиента по каким-либо причинам скомпрометирован, можно ли просто удалить его из хранилища доверенных сертификатов сервера?
- Есть ли преимущество в моем сценарии использования доверенного центра сертификации, например. verisign для создания клиентского сертификата вместо самоподписанного? т.е. сертификат передается мне напрямую от доверенной третьей стороны, а затем устанавливается.