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