147
правок
Изменения
SSL/TLS
,→Аутентификация и обмен ключами
== Аутентификация и обмен ключами ==
SSL поддерживает 3 типа аутентификации:
* аутентификация обеих сторон (клиент — сервер),* аутентификация сервера с неаутентифицированным клиентом,* полная анонимность. Обычно для аутентификации используются алгоритмы: ''RSA'', [https://en.wikipedia.org/wiki/Digital_Signature_Algorithm DSA], [https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm ECDSA]. Если сервер аутентифицирован, то его сообщение о сертификации должно обеспечить верную сертификационную цепочку, ведущую к приемлемому центру сертификации. Проще говоря, аутентифицированный сервер должен предоставить допустимый сертификат клиенту. Каждая сторона отвечает за проверку того, что сертификат другой стороны ещё не истек и не был отменен. Всякий раз, когда сервер аутентифицируется, канал устойчив (безопасен) к попытке перехвата данных между веб-сервером и браузером, но полностью анонимная сессия по своей сути уязвима к такой атаке. Анонимный сервер не может аутентифицировать клиента. Главная цель процесса обмена ключами — это создание секрета клиента (''pre_master_secret''), известного только клиенту и серверу. Секрет (''pre_master_secret'') используется для создания общего секрета (''master_secret''). Общий секрет необходим для того, чтобы создать сообщение для проверки сертификата, ключей шифрования, секрета MAC (''message authentication code'') и сообщения ''«finished»''. Отсылая сообщение ''«finished»'', стороны указывают, что они знают верный секрет (''pre_master_secret'').
=== Анонимный обмен ключами ===
Полностью анонимная сессия может быть установлена при использовании алгоритма ''RSA '' или ''Диффи-Хеллмана '' для создания ключей обмена. В случае использования ''RSA '' клиент шифрует секрет (''pre_master_secret'') с помощью открытого ключа несертифицированного сервера. Открытый ключ клиент узнает из сообщения обмена ключами от сервера. Результат посылается в сообщении обмена ключами от клиента. Поскольку перехватчик не знает закрытого ключа сервера, то ему будет невозможно расшифровать секрет (pre_master_secret). При использовании алгоритма Диффи-Хеллмана открытые параметры сервера содержатся в сообщении обмена ключами от сервера, и клиенту посылают в сообщении обмена ключами. Перехватчик, который не знает приватных значений, не сможет найти секрет (''pre_master_secret'').
=== Аутентификация и обмен ключами при использовании RSA ===
В этом случае обмен ключами и аутентификация сервера может быть скомбинирована. Открытый ключ также может содержаться в сертификате сервера или может быть использован временный ключ ''RSA'', который посылается в сообщении обмена ключами от сервера. Когда используется временный ключ RSA, сообщения обмена подписываются server’s RSA или сертификат ''DSS''. Сигнатура содержит текущее значение сообщения ''Client_Hello.random'', таким образом, старые сигнатуры и старые временные ключи не могут повторяться. Сервер может использовать временный ключ RSA только однажды для создания сессии. После проверки сертификата сервера клиент шифрует секрет (''pre_master_secret'') при помощи открытого ключа сервера. После успешного декодирования секрета (''pre_master_secret'') создается сообщение ''«finished»'', тем самым сервер демонстрирует, что он знает частный ключ, соответствующий сертификату сервера. Когда RSA используется для обмена ключами, для аутентификации клиента используется сообщение проверки сертификата клиента. Клиент подписывается значением, вычисленным из master_secret и всех предшествующих сообщений протокола рукопожатия. Эти сообщения рукопожатия содержат сертификат сервера, который ставит в соответствие сигнатуре сервера сообщение ''Server_Hello.random'', которому ставит в соответствие сигнатуру текущему сообщению рукопожатия. === Аутентификация и обмен ключами при использовании Diffieпротокола Диффи-Hellman Хеллмана === В этом случае сервер может также поддерживать содержащий конкретные параметры алгоритм Диффи-Хеллмана или может использовать сообщения обмена ключами от сервера для посылки набора временных параметров, подписанных сертификатами DSS или RSA. Временные параметры хэшируются с сообщением ''hello.random '' перед подписанием для того, чтобы злоумышленник не смог совершить повтор старых параметров. В любом случае клиент может проверить сертификат или сигнатуру для уверенности, что параметры принадлежат серверу. Если клиент имеет сертификат, содержащий параметры ''алгоритма Diffie-Hellman'', то сертификат также содержит информацию, требующуюся для того, чтобы завершить обмен ключами. В этом случае клиент и сервер должны будут сгенерировать одинаковые Diffie-Hellman результаты (''pre_master_secret'') каждый раз, когда они устанавливают соединение. Для того, чтобы предотвратить хранение секрета (''pre_master_secret'') в памяти компьютера на время дольше, чем необходимо, секрет должен быть переведен в общий секрет (''master_secret'') настолько быстро, насколько это возможно. Параметры клиента должны быть совместимы с теми, которые поддерживает сервер для того, чтобы работал обмен ключами.
== Восстановление сессии ==