SSL и безопасность открытого ключа - PullRequest
5 голосов
/ 31 октября 2011

Я использую веб-сервис с устройства Android, используя HTTP (s) с SSL. Самоподписанный (ненадежный) сертификат используется для аутентификации клиента .

У меня есть общее представление о том, как открытый / закрытый ключи используются для SSL. Из моего понимания я ясно вижу, как можно использовать сертификат для установки безопасного соединения и безопасной передачи данных. Однако я не понимаю, как они используются для аутентификации клиента, поскольку сертификат содержит открытый ключ и не хранится в секрете.

У меня есть несколько вопросов:

Где можно прочитать о том, как SSL и сертификаты могут использоваться для аутентификации клиента?

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

В этот пост Джереми Хуискамп пишет

аутентификация клиента будет автоматически выполняться при запросе сервера он

... так что аутентификация клиента, а также шифрование данных могут быть выполнены с сертификатами?

Отредактировано, чтобы ответить на первую часть моего вопроса: Хранилище ключей клиента должно содержать не только открытый ключ сервера, но также закрытый ключ клиента . Сервер должен быть в состоянии расшифровать с помощью открытого ключа клиента? Значит ли это, что хранилище ключей должно иметь два сертификата?

Ответы [ 2 ]

10 голосов
/ 31 октября 2011

Во-первых, краткий комментарий о терминологии в криптографии с открытым ключом:

  • вы подписываете и расшифровываете / расшифровываете с помощью закрытого ключа,
  • вы проверяете (подпись) и шифруете/ шифровать с помощью открытого ключа.

(Вы действительно не «расшифровываете» с помощью открытого ключа.)

Использование SSL / TLS с аутентификацией клиента или без него, серверпредставляет сертификат (*), для которого он имеет закрытый ключ.Сервер отправляет свой сертификат во время рукопожатия SSL / TLS (в начале соединения) и может расшифровать то, что отправляет клиент, используя свой закрытый ключ (который он сохраняет в секрете).Закрытый ключ и сертификаты хранятся в хранилище ключей сервера (или эквивалентном, если он не реализован в Java).

В рамках этого клиент использует свое хранилище доверенных сертификатов , который является формой хранилища ключей, содержащего доверенные сертификаты, для проверки сертификата сервера.Сертификату сервера можно доверять, если он явно находится в хранилище доверенных сертификатов, или, в большинстве случаев, доверять, связываясь с доверенным сертификатом CA в хранилище доверенных сертификатов (PKI).

Терминология между хранилищем ключей и хранилищем доверенных сертификатов в Java может бытьнемного запутанно, вы можете найти больше подробностей в этом ответе .

Что касается вашего вопроса, хранилище доверенных сертификатов клиента содержит не открытый ключ сервера, но его сертификат или сертификат CA скоторый должен быть проверяемым.(Речь идет не только о наличии открытого ключа, но и о том, чей это ключ, с использованием других частей информации в сертификате.)

Когда в дополнение к этому используется проверка подлинности с помощью сертификата клиента, существует хранилище доверенных сертификатов (или эквивалентный) на стороне сервера и хранилище ключей на стороне клиента, так как для этого роли поменялись местами.

В рукопожатии SSL / TLS, использующем проверку подлинности клиента, сервер запрашивает сертификат уклиент, который отправляет его (если доступно).

В конце этого рукопожатия клиент отправляет сообщение CertificateVerify, которое подписывает все сообщения, которыми обмениваются между клиентом исервер (так что это что-то известно обоим), используя закрытый ключ сертификата клиента.Затем сервер может проверить эту подпись по открытому ключу в клиентском сертификате, который он получил как часть этого обмена.Это доказывает серверу, что тот, кто находится на стороне клиента, имеет закрытый ключ, соответствующий открытому ключу в сертификате, который он отправил.

Следующим шагом для сервера является проверка того, стоит ли доверять этому сертификату, т.е.доверять ли связыванию между удостоверением и открытым ключом, как представлено и «запечатано» в сертификате.Обычно это делается с помощью PKI, когда вы проверяете сертификат по известному центру сертификации или, если ваша среда развертывания достаточно мала, по фиксированному набору доверенных сертификатов.(Могут быть альтернативные методы проверки , но их практическое применение будет действительно зависеть от обстоятельств, в которых вы хотите развернуть эту систему.)

Поэтому, для вашего второго вопроса:

  • Клиент хранилище ключей должен содержать как минимум сертификат клиента и его закрытый ключ.
  • Клиент хранилище доверенных сертификатов должен содержать сертификат сервера или сертификат CAс помощью которого можно проверить сертификат сервера.

Поскольку и хранилище ключей, и хранилище доверенных сертификатов являются хранилищем ключей (в смысле формата хранения, обычно файлом), используемым для разных целей, часто можно использовать одно и то жехранилище ключей служит как хранилищу ключей, так и хранилищу доверенных сертификатов.

(*) Существуют комплекты шифров, которые не зависят от сертификатов, но это необычно и не по теме в этом вопросе.

3 голосов
/ 31 октября 2011

Сертификат просто связывает личность с открытым ключом.Эта привязка не является секретной, поэтому нет необходимости хранить сертификат в секрете.Если у меня есть сертификат Джона Смита, я могу доказать, что Джон Смит владеет секретным ключом, соответствующим определенному открытому ключу.Но поскольку я не знаю этот секретный ключ, сертификат для меня бесполезен.

Когда аутентификация происходит по сертификату, всегда нужно, чтобы тот, кто представляет сертификат, доказывал, что знает секретный ключ, соответствующийоткрытый ключ в сертификате.Если вы не можете пройти этот шаг, аутентификация не пройдена.

Хранилище ключей сервера должно иметь сертификат сервера.Хранилище ключей клиента должно иметь сертификат клиента.Клиент представит свой сертификат серверу, поэтому сервер таким образом узнает открытый ключ клиента.(И наоборот.)

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