SSL/TLS — различия между версиями
Heatwave (обсуждение | вклад) (Добавил record и стаб введения.) |
Heatwave (обсуждение | вклад) (Основа TLS готова.) |
||
Строка 1: | Строка 1: | ||
=Протоколы SSL и TLS= | =Протоколы SSL и TLS= | ||
− | '''SSL (Secure Sockets Layer)''' и '''TLS (Transport Level Security)''' {{---}} криптографические протоколы, обеспечивающие защищенную передачу данных в компьютерной сети. | + | '''SSL (Secure Sockets Layer)''' и '''TLS (Transport Level Security)''' {{---}} криптографические протоколы, обеспечивающие защищенную передачу данных в компьютерной сети. Они широко используются в веб-браузерах, а также при работе с электронной почтой, обмене мгновенными сообщениями и в IP-телефонии. |
Соединение, защищенное протоколом TLS, обладает одним или несколькими следующими свойствами: | Соединение, защищенное протоколом TLS, обладает одним или несколькими следующими свойствами: | ||
Строка 7: | Строка 7: | ||
* ''Целостность'': каждое сообщение содержит код ('''Message Authentication Code, MAC'''), с помощью которого можно проверить, что данные не были изменены или потеряны в процессе передачи. | * ''Целостность'': каждое сообщение содержит код ('''Message Authentication Code, MAC'''), с помощью которого можно проверить, что данные не были изменены или потеряны в процессе передачи. | ||
− | + | Так как большинство протоколов связи могут быть использованы как с TLS/SSL, так и без него, при установке соединения необходимо явно указать серверу, хочет ли клиент устанавливать TLS. Один способ добиться этого {{---}} использовать порт, по которому соединение всегда устанавливается с использованием TLS (например, 443 для HTTPS). Другой способ {{---}} использовать специальную команду серверу от клиента переключить соединение на TLS (например, STARTTLS для протоколов электронной почты). | |
− | ===Подтверждение связи (handshake)=== | + | ==Механизм работы протокола== |
− | [[Файл:Handshake.png | + | |
+ | Протокол TLS делится на два слоя: '''TLS Record''' и '''TLS Handshake'''. | ||
+ | |||
+ | ====Подтверждение связи (handshake)==== | ||
+ | [[Файл:Handshake.png|right|Схема подтверждения связи]] | ||
# Клиент посылает сообщение '''ClientHello''', указывающее версию SSL или TLS и поддерживаемые клиентом методы шифрования (англ. ''CipherSuite''). Это сообщение также содержит случайное число (набор байт), которое используется в последующих вычислениях. Протокол также позволяет указать поддерживаемые клиентом методы сжатия данных. | # Клиент посылает сообщение '''ClientHello''', указывающее версию SSL или TLS и поддерживаемые клиентом методы шифрования (англ. ''CipherSuite''). Это сообщение также содержит случайное число (набор байт), которое используется в последующих вычислениях. Протокол также позволяет указать поддерживаемые клиентом методы сжатия данных. | ||
# Сервер отвечает сообщением '''ServerHello''', которое содержит метод шифрования, выбранный сервером из списка, предложенного клиентом, а также идентификатор сессии и еще одно случайное число. Также сервер посылает свой цифровой сертификат. Если серверу нужен сертификат для аутентификации клиента, на этом шаге он может послать клиенту запрос такого сертификата. | # Сервер отвечает сообщением '''ServerHello''', которое содержит метод шифрования, выбранный сервером из списка, предложенного клиентом, а также идентификатор сессии и еще одно случайное число. Также сервер посылает свой цифровой сертификат. Если серверу нужен сертификат для аутентификации клиента, на этом шаге он может послать клиенту запрос такого сертификата. | ||
Строка 22: | Строка 26: | ||
# На протяжении данной сессии клиент и сервер могут обмениваться сообщениями, зашифрованными секретным ключом. | # На протяжении данной сессии клиент и сервер могут обмениваться сообщениями, зашифрованными секретным ключом. | ||
− | ====Возобновление сессии==== | + | =====Возобновление сессии===== |
# Клиент посылает сообщение '''ClientHello''', используя ID сессии, которую нужно возобновить. | # Клиент посылает сообщение '''ClientHello''', используя ID сессии, которую нужно возобновить. | ||
# Сервер проверяет, есть ли у него в кэше соответствующий идентификатор. Если есть и сервер способен возобновить сессию, он отсылает клиенту сообщение '''ServerHello''' с этим же ID сессии. Если нет, сервер генерирует новый ID сессии и выполняет процедуру handshake с клиентом. | # Сервер проверяет, есть ли у него в кэше соответствующий идентификатор. Если есть и сервер способен возобновить сессию, он отсылает клиенту сообщение '''ServerHello''' с этим же ID сессии. Если нет, сервер генерирует новый ID сессии и выполняет процедуру handshake с клиентом. | ||
Строка 28: | Строка 32: | ||
# Передача данных по защищенному каналу возобновляется. | # Передача данных по защищенному каналу возобновляется. | ||
− | ===Протокол записи=== | + | ====Протокол записи==== |
Этот слой защищает данные с помощью ключей, полученных при подтверждении связи, и проверяет целостность и источник входящих сообщений. Он выполняет следующие функции: | Этот слой защищает данные с помощью ключей, полученных при подтверждении связи, и проверяет целостность и источник входящих сообщений. Он выполняет следующие функции: | ||
* Разбиение исходящих сообщений на блоки нужного размера и "склеивание" входящих сообщений. | * Разбиение исходящих сообщений на блоки нужного размера и "склеивание" входящих сообщений. | ||
Строка 36: | Строка 40: | ||
После обработки протоколом TLS Record зашифрованные данные передаются на слой TCP для передачи. | После обработки протоколом TLS Record зашифрованные данные передаются на слой TCP для передачи. | ||
+ | |||
+ | ==Меры безопасности в TLS== | ||
+ | * Защита от downgrade-атаки {{---}} понижения версии протокола к предыдущей (менее защищённой) версии или менее надёжному алгоритму шифрования; | ||
+ | * Нумерация последовательных записей приложения и использование порядкового номера в коде аутентификации сообщения (MAC); | ||
+ | * Использование ключа в идентификаторе сообщения (только владелец ключа может сгенерировать код аутентификации сообщения). | ||
+ | * Сообщение, которым заканчивается подтверждение связи («Finished»), содержит хэш всех handshake-сообщений, отправленных обеими сторонами, что позволяет проверить подлинность выбранных параметров TLS-соединения. | ||
+ | * Псевдослучайная функция делит подаваемые ей на вход данные пополам, применяет к половинкам разные хэш-алгоритмы (MD5 и SHA-1), а затем XOR'ит результаты для получения MAC. Это повышает безопасность в случае, если в одном из алгоритмов обнаружится уязвимость. | ||
+ | |||
+ | ==Ключевые отличия SSL и TLS== | ||
+ | * ''Аутентификация сообщений'': в TLS используется HMAC, работающий с любой хэш-функцией (а не только с MD5 или SHA, как в SSL). | ||
+ | * ''Генерация ключа'': в TLS при создании ключа используется псевдослучайная функция стандарта HMAC; в SSL {{---}} RSA, Diffie-Hellman или Fortezza/DMS. | ||
+ | * ''Проверка сертификата'': в SSL проверка требует передачи сложной последовательности сообщений; в TLS информация о проверке полностью передается в сообщениях во время handshake. | ||
+ | * ''Методы шифрования'': SSL поддерживает только алгоритмы RSA, Diffie-Hellman и Fortezza/DMS. В TLS отказались от поддержки Fortezza/DMS, но возможно добавление новых методов шифрования в последующих версиях. | ||
+ | |||
+ | == Источники информации == | ||
+ | * [https://www.sans.org/reading-room/whitepapers/protocols/ssl-tls-beginners-guide-1029 SSL and TLS: A Beginner's Guide] | ||
+ | * [https://en.wikipedia.org/wiki/Transport_Layer_Security Wikipedia: Transport Layer Security] | ||
+ | * [https://msdn.microsoft.com/en-us/library/windows/desktop/aa380516(v=vs.85).aspx Microsoft Developer Resources: Transport Layer Security Protocol] | ||
+ | * [http://www.ibm.com/support/knowledgecenter/en/SSFKSJ_7.1.0/com.ibm.mq.doc/sy10630_.htm IBM Knowledge Center: Cryptographic security protocols: SSL and TLS] |
Версия 02:06, 12 декабря 2016
Содержание
Протоколы SSL и TLS
SSL (Secure Sockets Layer) и TLS (Transport Level Security) — криптографические протоколы, обеспечивающие защищенную передачу данных в компьютерной сети. Они широко используются в веб-браузерах, а также при работе с электронной почтой, обмене мгновенными сообщениями и в IP-телефонии.
Соединение, защищенное протоколом TLS, обладает одним или несколькими следующими свойствами:
- Безопасность: симметричное шифрование защищает передаваемую информацию от прочтения посторонними лицами.
- Аутентификация: "личность" участника соединения можно проверить с помощью асимметричного шифрования.
- Целостность: каждое сообщение содержит код (Message Authentication Code, MAC), с помощью которого можно проверить, что данные не были изменены или потеряны в процессе передачи.
Так как большинство протоколов связи могут быть использованы как с TLS/SSL, так и без него, при установке соединения необходимо явно указать серверу, хочет ли клиент устанавливать TLS. Один способ добиться этого — использовать порт, по которому соединение всегда устанавливается с использованием TLS (например, 443 для HTTPS). Другой способ — использовать специальную команду серверу от клиента переключить соединение на TLS (например, STARTTLS для протоколов электронной почты).
Механизм работы протокола
Протокол TLS делится на два слоя: TLS Record и TLS Handshake.
Подтверждение связи (handshake)
- Клиент посылает сообщение ClientHello, указывающее версию SSL или TLS и поддерживаемые клиентом методы шифрования (англ. CipherSuite). Это сообщение также содержит случайное число (набор байт), которое используется в последующих вычислениях. Протокол также позволяет указать поддерживаемые клиентом методы сжатия данных.
- Сервер отвечает сообщением ServerHello, которое содержит метод шифрования, выбранный сервером из списка, предложенного клиентом, а также идентификатор сессии и еще одно случайное число. Также сервер посылает свой цифровой сертификат. Если серверу нужен сертификат для аутентификации клиента, на этом шаге он может послать клиенту запрос такого сертификата.
- Клиент проверяет сертификат сервера.
- Клиент отправляет случайное число, которое клиент и сервер используют для шифрования последующих сообщений. Сама строка из байт шифруется публичным ключом сервера.
- Если сервер потребовал у клиента сертификат, клиент отсылает набор байт, зашифрованный его секретным ключом, и свой цифровой сертификат, или оповещение об отсутствии сертификата.
- Сервер проверяет сертификат клиента.
- Клиент и сервер отправляют друг другу сообщение ChangeCipherSpec, объявляя об изменении режима передачи данных с незащищенного на защищенный.
- Клиент отправляет сообщение Finished, зашифрованное секретным ключом, и таким образом завершает подтверждение связи со своей стороны.
- Аналогичные действия производит сервер.
- На протяжении данной сессии клиент и сервер могут обмениваться сообщениями, зашифрованными секретным ключом.
Возобновление сессии
- Клиент посылает сообщение ClientHello, используя ID сессии, которую нужно возобновить.
- Сервер проверяет, есть ли у него в кэше соответствующий идентификатор. Если есть и сервер способен возобновить сессию, он отсылает клиенту сообщение ServerHello с этим же ID сессии. Если нет, сервер генерирует новый ID сессии и выполняет процедуру handshake с клиентом.
- Клиент и сервер обмениваются сообщениями ChangeCipherSpec, а затем Finished.
- Передача данных по защищенному каналу возобновляется.
Протокол записи
Этот слой защищает данные с помощью ключей, полученных при подтверждении связи, и проверяет целостность и источник входящих сообщений. Он выполняет следующие функции:
- Разбиение исходящих сообщений на блоки нужного размера и "склеивание" входящих сообщений.
- Сжатие исходящих сообщений и распаковку входящих (используется не всегда).
- Применение кода аутентификации к исходящим сообщениям и проверку входящих с помощью MAC.
- Шифрование исходящих сообщений и дешифровку входящих.
После обработки протоколом TLS Record зашифрованные данные передаются на слой TCP для передачи.
Меры безопасности в TLS
- Защита от downgrade-атаки — понижения версии протокола к предыдущей (менее защищённой) версии или менее надёжному алгоритму шифрования;
- Нумерация последовательных записей приложения и использование порядкового номера в коде аутентификации сообщения (MAC);
- Использование ключа в идентификаторе сообщения (только владелец ключа может сгенерировать код аутентификации сообщения).
- Сообщение, которым заканчивается подтверждение связи («Finished»), содержит хэш всех handshake-сообщений, отправленных обеими сторонами, что позволяет проверить подлинность выбранных параметров TLS-соединения.
- Псевдослучайная функция делит подаваемые ей на вход данные пополам, применяет к половинкам разные хэш-алгоритмы (MD5 и SHA-1), а затем XOR'ит результаты для получения MAC. Это повышает безопасность в случае, если в одном из алгоритмов обнаружится уязвимость.
Ключевые отличия SSL и TLS
- Аутентификация сообщений: в TLS используется HMAC, работающий с любой хэш-функцией (а не только с MD5 или SHA, как в SSL).
- Генерация ключа: в TLS при создании ключа используется псевдослучайная функция стандарта HMAC; в SSL — RSA, Diffie-Hellman или Fortezza/DMS.
- Проверка сертификата: в SSL проверка требует передачи сложной последовательности сообщений; в TLS информация о проверке полностью передается в сообщениях во время handshake.
- Методы шифрования: SSL поддерживает только алгоритмы RSA, Diffie-Hellman и Fortezza/DMS. В TLS отказались от поддержки Fortezza/DMS, но возможно добавление новых методов шифрования в последующих версиях.