Во-первых, краткий комментарий о терминологии в криптографии с открытым ключом:
- вы подписываете и расшифровываете / расшифровываете с помощью закрытого ключа,
- вы проверяете (подпись) и шифруете/ шифровать с помощью открытого ключа.
(Вы действительно не «расшифровываете» с помощью открытого ключа.)
Использование SSL / TLS с аутентификацией клиента или без него, серверпредставляет сертификат (*), для которого он имеет закрытый ключ.Сервер отправляет свой сертификат во время рукопожатия SSL / TLS (в начале соединения) и может расшифровать то, что отправляет клиент, используя свой закрытый ключ (который он сохраняет в секрете).Закрытый ключ и сертификаты хранятся в хранилище ключей сервера (или эквивалентном, если он не реализован в Java).
В рамках этого клиент использует свое хранилище доверенных сертификатов , который является формой хранилища ключей, содержащего доверенные сертификаты, для проверки сертификата сервера.Сертификату сервера можно доверять, если он явно находится в хранилище доверенных сертификатов, или, в большинстве случаев, доверять, связываясь с доверенным сертификатом CA в хранилище доверенных сертификатов (PKI).
Терминология между хранилищем ключей и хранилищем доверенных сертификатов в Java может бытьнемного запутанно, вы можете найти больше подробностей в этом ответе .
Что касается вашего вопроса, хранилище доверенных сертификатов клиента содержит не открытый ключ сервера, но его сертификат или сертификат CA скоторый должен быть проверяемым.(Речь идет не только о наличии открытого ключа, но и о том, чей это ключ, с использованием других частей информации в сертификате.)
Когда в дополнение к этому используется проверка подлинности с помощью сертификата клиента, существует хранилище доверенных сертификатов (или эквивалентный) на стороне сервера и хранилище ключей на стороне клиента, так как для этого роли поменялись местами.
В рукопожатии SSL / TLS, использующем проверку подлинности клиента, сервер запрашивает сертификат уклиент, который отправляет его (если доступно).
В конце этого рукопожатия клиент отправляет сообщение CertificateVerify
, которое подписывает все сообщения, которыми обмениваются между клиентом исервер (так что это что-то известно обоим), используя закрытый ключ сертификата клиента.Затем сервер может проверить эту подпись по открытому ключу в клиентском сертификате, который он получил как часть этого обмена.Это доказывает серверу, что тот, кто находится на стороне клиента, имеет закрытый ключ, соответствующий открытому ключу в сертификате, который он отправил.
Следующим шагом для сервера является проверка того, стоит ли доверять этому сертификату, т.е.доверять ли связыванию между удостоверением и открытым ключом, как представлено и «запечатано» в сертификате.Обычно это делается с помощью PKI, когда вы проверяете сертификат по известному центру сертификации или, если ваша среда развертывания достаточно мала, по фиксированному набору доверенных сертификатов.(Могут быть альтернативные методы проверки , но их практическое применение будет действительно зависеть от обстоятельств, в которых вы хотите развернуть эту систему.)
Поэтому, для вашего второго вопроса:
- Клиент хранилище ключей должен содержать как минимум сертификат клиента и его закрытый ключ.
- Клиент хранилище доверенных сертификатов должен содержать сертификат сервера или сертификат CAс помощью которого можно проверить сертификат сервера.
Поскольку и хранилище ключей, и хранилище доверенных сертификатов являются хранилищем ключей (в смысле формата хранения, обычно файлом), используемым для разных целей, часто можно использовать одно и то жехранилище ключей служит как хранилищу ключей, так и хранилищу доверенных сертификатов.
(*) Существуют комплекты шифров, которые не зависят от сертификатов, но это необычно и не по теме в этом вопросе.