ClientHello - это первый сообщение, отправляемое клиентом при установлении защищенного соединения с использованием протокола TLS (Transport Layer Security). ClientHello содержит информацию о возможностях клиента и параметрах сессии, которые могут быть использованы при установлении защищенного соединения.
Структура ClientHello сообщения в TLS определена в стандарте TLS 1.2 (RFC 5246) и состоит из следующих полей:
- ProtocolVersion (2 байта): определяет версию TLS используемую клиентом.
- Random (32 байта): случайное значение, генерируемое клиентом для предотвращения повторяемости сессионных ключей. Оно используется в позднейшем для генерации сессионных ключей.
- SessionID Length (1 байт): указывает длину SessionID поля.
- SessionID (0-32 байта): идентификатор предыдущей сессии, который клиент предлагает серверу для повторного использования. Если у клиента нет предыдущей сессии или он не хочет ее повторно использовать, SessionID равен нулю.
- CipherSuites Length (2 байта): указывает длину поля CipherSuites.
- CipherSuites (2-64 кратное число байт): список криптографических алгоритмов, поддерживаемых клиентом. Он представлен в виде упорядоченного списка идентификаторов, где каждый идентификатор представлен двумя байтами. Криптографический алгоритм включает в себя алгоритм шифрования, алгоритм аутентификации и алгоритм обеспечения целостности.
- Compression Methods Length (1 байт): указывает длину поля Compression Methods.
- Compression Methods (1-255 байт): список методов сжатия, поддерживаемых клиентом. Каждый метод сжатия представлен одним байтом.
- Extensions Length (2 байта): указывает длину поля Extensions.
- Extensions (0-65535 байт): дополнительные расширения, поддерживаемые клиентом. Каждое расширение представлено в виде определенной структуры данных и состоит из идентификатора расширения и данных расширения.
ClientHello может содержать несколько расширений, таких как Server Name Indication (SNI), который позволяет клиенту указать, с каким именем сервера он хочет установить соединение, и Supported Elliptic Curves, который указывает, какие эллиптические кривые поддерживает клиент.
ClientHello является основой для установления защищенного соединения в TLS и служит для обмена информацией о возможностях клиента, чтобы сервер мог выбрать подходящие параметры сессии и криптографические алгоритмы.