Я реализую взаимную аутентификацию между одним клиентским приложением (CLIENT) и моим приложением Spring Boot 2 (SERVER). Я понимаю, что шаги должны быть следующими:
Сервер генерирует хранилище ключей и магазин доверия. хранилище ключей используется для хранения сертификатов сервера и закрытого ключа. магазин доверия используется для хранения других учетных данных (сертификатов от центра сертификации (CA) или сертификатов доверенных клиентов).
Для сервера создается CSR, который затем передается в CA. CA генерирует подписанный сертификат из CSR. Он установлен в хранилище ключей сервера.
Когда от клиента к серверу отправляется https-запрос:
Так что у меня есть несколько вещей, которые меня немного смущают ...

Что касается вашего вопроса первый, да, ваши изложенные шаги верны! Вот общий поток mutualSSL с графическим обзором: (источник)
- A client requests access to a protected resource.
- The server presents its certificate to the client.
- The client verifies the server’s certificate.
- If successful, the client sends its certificate to the server.
- The server verifies the client’s credentials.
- If successful, the server grants access to the protected resource requested by the client.
Ваш вопрос второй (Как сервер проверяет сертификат клиента?):
Сервер проверяет сертификат клиента с помощью подписи. Подпись обычно представляет собой хэш-значение, построенное на основе полного сертификата. Хэш-значение подписано закрытым ключом соответствующего CA (центра сертификации). Сервер проверяет подпись сертификата клиента с помощью открытого сертификата CA.
Ваш вопрос в третьих (Серверы доверенного хранилища, содержащие открытый ключ / сертификат клиента или соответствующий сертификат CA?):
Если вы используете, например, самозаверяющие сертификаты, вам, вероятно, придется импортировать открытый ключ / сертификат клиента непосредственно в хранилище доверенных сертификатов сервера. Если ваш клиент использует подписанный сертификат CA, для вашего сервера целесообразно хранить только открытый ключ / сертификат CA, поскольку он используется для проверки сертификата клиента.
Ваш вопрос четвертый (Действительно ли этот процесс аутентифицирует клиента?): Да! Как видно из ответа на второй вопрос, сертификат проверяется проверкой подписи. Подпись - это хэш над полным сертификатом. Стандартный X.509 содержит информацию для идентификации субъекта. Проверяя подпись, субъект аутентифицируется. Стандартный сертификат X.509, помимо прочего, содержит, например, эта информация:
Имя субъекта, информация об открытом ключе субъекта, алгоритм открытого ключа, уникальный идентификатор эмитента (необязательно), ...
Ваш вопрос пятый (Куда идет проверка CN?): Проверка CN (общее имя) выполняется во время проверки сертификата. CN определяет действительное имя хоста для текущего сертификата. Он ограничен одной записью. В качестве расширения был представлен SAN (альтернативное имя субъекта). Сертификат может содержать более одного SAN. Запись CN (и SAN) является частью сертификата и проверяется с помощью проверки подписи сертификата.
Ваш вопрос шестой (Если сертификат клиента по каким-либо причинам скомпрометирован, можно ли просто удалить его из хранилища доверенных сертификатов сервера?): Следовательно, CA используют так называемый revocation lists. Если вы используете, например, самозаверяющие сертификаты, также можно просто удалить скомпрометированную запись сертификата из хранилища доверенных сертификатов серверов.
Ваш вопрос седьмой (Есть ли преимущество в моем сценарии использования доверенного центра сертификации, например. verisign для создания клиентского сертификата вместо самоподписанного?): Существует несколько преимуществ использования подписанного сертификата CA вместо самозаверяющего.
CA.CA, например VerisignCA предлагают стандартизированные способы создания сертификата.CA обычно принимается сервером и клиентом. Если у клиента нет сертификата, подписанного CA, сервер должен иметь открытый сертификат клиента в своем хранилище доверенных сертификатов. Таким образом, сервер может проверять запросы клиентов.
@ git-flow Спасибо за ваш ответ, я очень признателен. Что касается проверки CA (вопрос 2), CA предположительно должен быть специфичным для этого сервера. то есть клиент поднимает csr, а сервер подписывает его своим CA? На вопрос 2, как работает проверка, когда ЦС не используется, т.е. сертификат клиента устанавливается непосредственно в хранилище доверенных сертификатов сервера?