SSL

SSL ( англ. Secure Sockets Layer - Уровень защищенных сокетов) - криптографический протокол, который обеспечивает установление безопасного соединения между клиентом и сервером. SSL изначально разработан компанией Netscape Communications. Впоследствии на основании протокола SSL 3.0 был разработан и принят стандарт RFC, получивший имя TLS.

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


1. Описание

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

SSL предоставляет канал имеет 3 основные свойства:

  • Аутентификация. Сервер всегда аутентифицируются, в то время как клиент аутентифицируются в зависимости от алгоритма.
  • Целостность. Сообщения включает в себя проверку целостности.
  • Конфиденциальность канала. Шифрование используется после установления соединения и используется для всех последующих сообщений.

В протоколе SSL все данные передаются в виде записей-объектов, состоящие из заголовка и передаваемых данных. Передача начинается с заголовка. Заголовок содержит или два, или три байта кода длины. Причем, если старший бит в первом байте кода равен единице, то запись не имеет заполнителя и полная длина заголовка равна двум байтам, иначе запись содержит заполнитель и полная длина заголовка равна трем байтам. Код длины записи не включает в себя число байт заголовка. Длина записи 2х байтового заголовка:

RecLength = (byte [0] & 0x7F << 8) | byte [1];

Здесь byte [0] и byte [1] первый и второй полученные байты. Длина записи 3х байтового заголовка:

RecLength = (byte [0] & 0x3F << 8) | byte [1]; Escape = (byte [0] & 0x40)! = 0; Padding = byte [2];

Здесь Padding определяет число байтов добавленных отправителем к исходному тексту, для того чтобы сделать длину записи кратной размеру блока шифра, при использовании блочного шифра.
Теперь отправитель "заполненной" записи добавляет заполнитель при имеющихся данных и шифрует все это. Причем содержание заполнителя никакой роли не играет. Так что известный объем передаваемых данных, то заголовок может быть сформирован с учетом Padding.
В свою очередь получатель записи дешифрует все поле данных и получает полную исходную информацию. Затем производится вычисление значения RecLength по известному Padding, и заполнитель из поля данных удаляется. Данные записи SSL состоят из 3х компонент:

MAC_Data [Mac_Size] - (Message Authentication Code) - код аутентификации сообщения Padding_Data [Padding] - данные заполнителя Actual_Data [N] - реальные данные

Когда записи посылаются открытым текстом, очевидно, что никакие шифры не используются. Тогда длина Padding_Data и MAC_Data равны нулю. При использовании шифрования, Padding_Data зависит от размера блока шифра, а MAC_Data зависит от выбора шифра. Пример исчисления MAC_Data:

MacData = Hash (Secret, Actual_Data, Padding_Data, Sequence_Number)

Значение Secret зависит от того, кто (клиент или сервер) посылает сообщение. Sequence_Number - счетчик, который инкрементируется как сервером, так и клиентом. Здесь Sequence_Number представляет собой 32х битный код, который передается хеш-функции в виде 4х байт, причем первым передается старший байт. Для MD2, MD5 MAC_Size равен 16 байтам (128 битам). Для 2х байтового заголовка максимальная длина записи равна 32767 байт, а для 3х байтного заголовка 16383 байт.


2. История и развитие

Протокол SSL был изначально разработан компанией Netscape. Версия протокола 1.0 публично не выпускалась. Версия 2.0 была выпущена в феврале 1995 года, но "содержала много недостатков по безопасности, которые, в конечном счете, привели к созданию версии 3.0", которая была выпущена в 1996 году. Тем самым версия SSL 3.0 послужила основой для создания протокола TLS 1.0, стандарт протокола Internet Engineering Task Force ( IETF) впервые был определен в RFC 2246 в январе 1999 года. Visa, Master Card, American Express и многие другие организации, работающие с интернет деньгами, имеющими лицензию на использование протокола SSL, для коммерческих целей в сети Интернет.

SSL работает модульным способом. Тем самым SSL расширяемость в соответствии с проектом о поддержке передней и обратной совместимости и переговоров между соединениями в одноранговой сети.


3. Применение

Значительное использование протокола SSL привело к формированию протокола HTTPS (Hypertext Transfer Protocol Secure), который поддерживает шифрование. Данные, передаваемые по протоколу HTTPS, "упаковываются" в криптографический протокол SSL или TLS, тем самым обеспечивая защиту этих данных. Такой способ защиты широко используется в мире Веб для приложений, в которых важна безопасность соединения, например в платежных системах. HTTPS поддерживается всеми браузерами. В отличие от HTTP, для HTTPS по умолчанию используется TCP -порт 443.

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


4. Основные цели протокола в порядке приоритетности

  1. Криптографическая безопасность: SSL устанавливает безопасное соединение между двумя сторонами.
  2. Совместимость: Программисты, независимо друг от друга, могут создавать приложения, использующие SSL, которые впоследствии будут способны успешно обмениваться криптографическими параметрами без всякого знания кода чужих программ.
  3. Расширяемость: SSL стремится обеспечить рабочее пространство, в котором новые открытые ключи и трудоемкие методы шифрования могут быть добавлены при необходимости.
  4. Относительная эффективность: работа протокола на основе SSL требует больших скоростей от CPU, в частности для работы с открытыми ключами. Поэтому к SSL протокола была включена необязательно схема кэширования сессий для уменьшения количества соединений, которые необходимо устанавливать с нуля. Кроме того, большое внимание уделяется тому, чтобы уменьшить сетевую активность.

5. Аутентификация и обмен ключами

SSL поддерживает 3 типа аутентификации:

  • Аутентификация обеих сторон (клиент - сервер),
  • Аутентификация сервера с неопознанных клиентом
  • Полная анонимность.

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

Главная цель процесса обмена ключами - это создание секрета клиента (pre_master_secret), известного только клиенту и серверу. Секрет (pre_master_secret) используется для создания общей тайны (master_secret). Общий секрет необходим для того чтобы создать для проверки сертификата, ключей шифрования, секрета MAC (message authentication code) и сообщение "finished". При посылке верного сообщения "finished", тем самым стороны докажут что они знают верный секрет (pre_master_secret).


5.1. Анонимный обмен ключами

Полностью анонимная сессия может быть установлена ​​при использовании алгоритма RSA или Диффи-Хеллмана для создания ключей обмена. При использовании RSA клиент шифрует секрет (pre_master_secret) с помощью открытого ключа несертифицированного сервера. Открытый ключ клиент узнает из сообщения обмена ключами от сервера. Результат направляется в сообщении обмена ключами от клиента. Поскольку перехватчик не знает закрытого ключа сервера, то ему будет невозможно расшифровать секрет (pre_master_secret). При использовании алгоритма Диффи-Хеллмана открытые параметры сервера содержатся в сообщении обмена ключами от сервера, и клиенту посылают в сообщении обмена ключами. Перехватчик, который не знает частных значений, не сможет найти секрет (pre_master_secret).


5.2. Обмен ключами при использовании RSA и аутентификация

В этом случае обмен ключами и аутентификация сервера может быть скомбинирована. Открытый ключ также может содержаться в сертификате сервера или может быть использован временный ключ RSA, который ссылается в сообщении обмена ключами от сервера. Когда используется временный ключ RSA, сообщение обмена подписываются server's RSA или сертификат DSS. Сигнатура включает текущее значение сообщения Client_Hello.random, таким образом старые сигнатуры и старые временные ключи не могут повторяться. Сервер может использовать временный ключ RSA только однажды для создания сессии. После проверки сертификата сервера клиент шифрует секрет (pre_master_secret) с помощью открытого ключа сервера. После успешного декодирования секрета (pre_master_secret) создается сообщение "finished", тем самым сервер демонстрирует, что он знает закрытый ключ соответствующий сертификата сервера.

Когда RSA используется для обмена ключами, аутентификации клиента используется сообщение проверки сертификата клиента. Клиент подписывается значением, вычисленным по master_secret и всех предыдущих сообщений протокола рукопожатия. Эти сообщения рукопожатия включают сертификат сервера, который ставит в соответствие сигнатуре сервера, сообщение Server_Hello.random, которому ставит в соответствие сигнатуру текущем сообщению рукопожатия.


5.3. Обмен ключами при использовании Diffie-Hellman и аутентификация

В этом случае сервер может также поддерживать содержит конкретные параметры алгоритм Диффи-Хеллмана или может использовать сообщения обмена ключами от сервера для посылки набора временных параметров подписанных сертификатами DSS или RSA. Временные параметры хешируются сообщению hello.random перед подписанием, для того чтобы злоумышленник не смог совершить повтор старых параметров. В любом случае клиент может проверить сертификат или сигнатуру, для уверенности, что параметры принадлежат сервера.

Если клиент сертификат, содержащий параметры алгоритма Diffie-Hellman, то сертификат также информацию, необходимую для того чтобы завершить обмен ключами. Заметим, что в этом случае клиент и сервер должны будут сгенерировать те же Diffie-Hellman результаты (pre_master_secret), каждый раз, когда они подключены. Для того чтобы предотвратить остановке секрета (pre_master_secret) в памяти компьютера на время дольше, чем необходимо, секрет должен быть переведен в общий секрет (master_secret) настолько быстро, насколько это возможно. Параметры клиента должны быть совместимы с теми, которые поддерживает сервер для того, чтобы работал обмен ключами.


6. Протокол записи (Record Layer)

Протокол записи - это уровневый протокол. На каждом уровне сообщения включают поля длины, описания и проверки. Протокол записи принять сообщение, нужно передать, фрагментирует данные в управляемые блоки, разумно сжимает данные, используя MAC (message authentication code), шифрует и передает результат. Полученные данные он расшифровывает, проверяет, распаковывает, собирает и доставляет к более верхним уровням клиента.

Существует четыре протокола записи: протокол рукопожатия (handshake protocol), протокол тревоги (alert protocol), протокол изменения шифра (the change cipher spec protocol), протокол приложения (application data protocol). Если SSL реализация получает тип записи, который ей неизвестен, то эта запись просто игнорируется. Любой протокол создан для использования совместно с SSL должен быть хорошо продуман, так как будет иметь дело с атаками на него. Заметим, что из-за типа и длины записи, протокол не защищен шифрованием. Внимание следует уделить тому, чтобы минимизировать трафик.


6.1. Протокол рукопожатия (handshake)

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

  • Рукопожатие начинается тогда, когда клиент подключается к SSL сервера. Запрос безопасного соединения представляет собой список поддерживаемых шифров и хэш-функций.
  • Из этого списка сервер выбирает сильный шифр и хэш-функцию, которую он также поддерживает, и сообщает клиентам о принятом решении.
  • Сервер отсылает это решение в виде цифрового сертификата. Сертификат, конечно, содержит имя сервера, доверенный Центр Сертификации, и открытый ключ шифрования сервера. Клиент может связаться с сервером, который выдал сертификат (доверенного центра сертификации, выше) и убедиться, что сертификат является настоящим, прежде чем продолжить.
  • Для того, чтобы сгенерировать ключи сеанса, используется безопасное соединение. Клиент шифрует случайное число с помощью открытого ключа (ОК) сервера и отправляет результат на сервер. Только сервер в состоянии расшифровать его (с его закрытым ключом (ЗК)), и только этот факт делает ключи скрытыми от третьей стороны, так как только сервер и клиент имели доступ к этим данным. Клиент знает открытый ключ и случайное число, а сервер знает закрытый ключ и (после расшифровки сообщения клиента) случайное число. Третья сторона, возможно, знает только открытый ключ, если закрытый ключ не был сломлен.
  • С случайного числа обе стороны создают ключевые данные для шифрования и расшифровки.

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


6.2. Протокол изменения параметров шифрования (The Change Cipher Spec Protocol)

Он существует для сигнализации перехода в режим шифрования. Протокол содержит единственное сообщение зашифровано и сжато при текущем установленном соединении. Сообщение состоит только из одного бита со значением 1.

struct {enum {change_cipher_spec (1), (255)} type;} ChangeCipherSpec;

Сообщение изменения шифра посылается и клиентом и сервером для оповещения принимающей стороны, следующие записи будут защищены согласно новым договоренностям CipherSpec и ключами. Принятие этого сообщения заставляет получателя отдать приказ уровня записи немедленно копировать состояние отложенного чтения в состояние текущего чтения. Сразу после послания этого сообщения, то кто послал должен отдать приказ уровня записи перевести режим отложенной записи в режим текущей записи. Сообщение изменения шифра посылается во время рукопожатия, после того как параметры защиты были переданы, но перед тем как будет отправлено 'finished ".


6.3. Протокол тревоги (Alert Protocol)

Один из типов проверки, которые поддерживаются в протоколе SSL записи, - это протокол тревоги. Сообщение тревоги передает трудности, возникшие в сообщении, и описание тревоги. Сообщение тревоги с критическим уровнем немедленно прерывает соединение. В этом случае другие соединения, соответствующие сессии, могут быть продлены, но идентификатор сессии должен быть признан недействительным. Как и другие, сообщения тревоги зашифровано и сжато, как только указано текущее состояние соединения.

6.4. Протокол приложения (Application Data Protocol)

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

7. Ошибки в протоколе SSL

В протоколе SSL обработка ошибок очень проста. Когда ошибка обнаружена, тот, кто ее обнаружил, посылает об этом сообщение своему партнеру. Непреодолимые ошибки требуют от сервера и клиента разрыва соединения. Протокол SSL определяет следующие ошибки:

  1. Unsupported_Certificate_Type_Error: такая ошибка возникает, когда клиент / сервер получает тип сертификата не поддерживается. Ошибка устранена (только для аутентификации клиента).
  2. No_Cipher_Error: ошибка возникает, когда сервер не может найти размер ключа или шифр, который поддерживается также и клиентом. Ошибка неотразима.
  3. Bad_Certificate_Error: такая ошибка возникает, когда сертификат считается принимающей стороной плохим. Это означает, что либо некорректная подпись сертификата, или его значение некорректно. Ошибка устранена (только для аутентификации клиента).
  4. No_Certificate_Error: если уведомление Request_Certificate, то эта ошибка может быть направлена ​​через то, что клиент не имеет сертификата. Ошибка устранена.

8. Атаки

Опишем ряд атак, которые могут быть сделаны против протокола SSL. Однако, SSL устойчив к этим атакам.

8.1. Раскрытие шифров

Как известно, SSL зависит от различных криптографических параметров. Шифрование с открытым ключом RSA необходимо для пересылки ключей и аутентификации сервера / клиента. Однако как шифра используются различные криптографические алгоритмы. Таким образом, если осуществить успешную атаку на эти алгоритмы, то SSL не может уже считаться безопасным. Атака на определенные коммуникационные сессии проводится записью сессии, и затем, в течение долгого времени подбирается ключ сессии или ключ RSA. SSL же делает такую ​​атаку невыгодной, так как расходуется большое количество времени и денег.


8.2. Злоумышленник посередине

Также известна как MitM (Man-in-the-Middle) атака. Предусматривает участие трех сторон: сервера, клиента и злоумышленника, находящегося между ними. В данной ситуации злоумышленник может перехватывать все сообщения, которые следуют в обоих направлениях, и подменять их. Злоумышленник представляется сервером для клиента и клиентом для сервера. В случае обмена ключами по алгоритма Диффи-Хеллмана данная атака является эффективной, поскольку целостность принимаемой информации и ее источник проверить невозможно. Однако такая атака невозможна при использовании протокола SSL, так как для проверки подлинности источника (обычно сервера) используются сертификаты, заверенные центром сертификации.

Атака будет успешной, если:

  • Сервер не имеет подписанного сертификата.
  • Клиент не проверяет сертификат сервера.
  • Пользователь игнорирует сообщение об отсутствии подписи сертификата центром сертификации или о разногласиях сертификата по кэшироваться.

Замечания. Работа HTTPS -фильтра (который устанавливает туннель в обе стороны и отдает свой ​​сертификат клиенту) в MS Forefront TGM, работающий по этой схеме, не является атакой, но средством защиты и контроля.


8.3. Атака отзывов

Злоумышленник записывает коммуникационную сессию между сервером и клиентом. Позже, он пытается установить соединение с сервером, воспроизводя записанные сообщения клиента. Но SSL отражает эту атаку с помощью особого уникального идентификатора соединения (ИС). Конечно, теоретически третья сторона не в силах предсказать ИС, так как он основан на наборе случайных событий. Однако, злоумышленник с большими ресурсами может записать большое количество сессий и попытаться подобрать "правильную" сессию, основываясь на коде nonce, который послал сервер в сообщение Server_Hello. Но коды nonce SSL имеют, по меньшей мере, длину 128 бит, а значит, злоумышленнику необходимо записать 2 ^ {64} кодов nonce, чтобы получить вероятность угадывания 50%. Но 2 ^ {64} достаточно большое число, чтобы сделать эти атаки бессмысленными.


8.4. Атака против протокола рукопожатие

Злоумышленник может попытаться повлиять на обмен рукопожатиями для того, чтобы стороны выбрали разные алгоритмы шифрования, а не те, что они выбирают обычно. Так что многие реализации поддерживают 40-битное шифрование экспортировано, а некоторые даже 0-шифрования или MAC-алгоритм, эти атаки представляют большой интерес.

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


9. Алгоритмы, используемые в SSL

  • Для обмена ключами и проверки их достоверности применяются: RSA, Diffie-Hellman, ECDH, SRP, PSK.
  • Для аутентификации: RSA, DSA, ECDSA.
  • Для симметричного шифрования: RC2, RC4, IDEA, DES, Triple DES или AES, Camellia.
  • Для хеш-функций: SHA, MD5, MD4 и MD2.

См.. также