SSL HandShake на клиенте Java - PullRequest
       13

SSL HandShake на клиенте Java

5 голосов
/ 23 апреля 2010

У меня очень простые сомнения в SSL HandShake. Предположим, что у нас есть сервер S, который использует самозаверяющие сертификаты. Я пишу Java-клиент C, который подключается к S. Когда C подключается к S, C получает сертификаты от S и сохраняет их в своем хранилище доверенных сертификатов, а остальная часть связи продолжается. Через некоторое время я использую тот же C для подключения к S, поэтому S снова отправит сертификаты C, или C будет использовать сертификаты, уже хранящиеся в хранилище доверенных сертификатов. Я не очень хорош в SSL и базовой реализации функциональности Truststore в Java.

Будет ли S отправлять сертификаты C неизменным, если C имеет сертификаты в своем доверенном хранилище ?? Я считаю, что если у меня есть сертификаты в хранилище доверенных сертификатов C, доверие S и C не будут запрашивать сертификаты при повторном подключении ?? Правильно ли мое предположение ??

Является ли процесс одинаковым для самозаверяющих сертификатов и сертификатов CA ??

Спасибо заранее.

1 Ответ

6 голосов
/ 23 апреля 2010

Это мое понимание SSL, я не специалист в данной области, но, при отсутствии других ответов, надеюсь, я, по крайней мере, могу дать вам несколько вещей для размышлений.

Когда вы создаете самозаверяющий сертификат для сервера, вам нужно каким-то образом добавить его к клиенту, он не будет установлен сразу после подключения клиента, иначе любой сервер может просто стать доверенным, отправив самозаверяющий сертификат на все, что пытается подключиться к нему. В моем приложении сертификат сервера загружается в склад доверенных сертификатов клиента при его запуске, указав javax.net.ssl.truststore ("путь / к / серверу / сертификат");

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

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

Итак, подведем итог: самоподписанный сертификат сервера должен быть установлен на клиенте с помощью связи SSL (например, как сертификаты корневого ЦС устанавливаются в продукте с самого начала). Каждое SSL-соединение, устанавливаемое между клиентом и сервером, требует, чтобы сервер отправлял свой сертификат клиенту, чтобы он мог проверить его в своем хранилище доверенных сертификатов.

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

Надеюсь, это хотя бы даст вам возможность подумать.

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