2013-08-03 2 views
1

У меня есть приложение на C++, которое принимает простые и зашифрованные соединения SSL/TLS. В настоящее время он делает это на двух отдельных портах.Автоматическое обнаружение, если TCP-соединение использует SSL/TLS?

Я хотел бы иметь возможность использовать один порт и определить, использует ли клиент TLS или нет, и соответствующим образом реагировать.

Возможно ли «заглянуть» в розетку без вмешательства в первоначальное рукопожатие TLS?

Я использую OpenSSL для реализации TLS.

ответ

4

Вам просто нужно заглянуть в первые несколько байтов нового входящего соединения, не используя их (звонок recv() с флагом MSG_PEEK) и посмотреть, похоже ли они как сообщение SSL ClientHello, как определено в RFC 2246. Затем решите, продолжать ли как открытый текст или через SSL.

2

Я не верю, что есть легкое решение этой задачи.

взято с IETF.

RFC 2246 Система TLS-протокол версии 1.0 января 1999

принимающая сторона может принять решение по своему усмотрению, следует ли рассматривать этот как фатальная ошибка или нет. Однако все сообщения, которые являются , переданные с уровнем смертности, должны рассматриваться как фатальные сообщения .

7.3. Обзор протокола подтверждения связи

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

ДУС Рукопожатие Протокол включает в себя следующие этапы:

  • Обмен сообщениями Привет согласующиеся алгоритмы, обмен случайными значения, и проверьте сессии возобновления.

  • Замените необходимые криптографические параметры, чтобы позволить клиенту и серверу договориться о секретности предварительного ключа.

  • Сертификаты Exchange и криптографическая информация, позволяющие клиенту и серверу аутентифицироваться.

  • Сгенерируйте главный секрет из секретности premaster и обменивается случайными значениями .

  • Предоставить параметры безопасности для уровня записи.

  • Разрешить клиент и сервер проверить, что их сверстники имеют вычислили то же параметры безопасности и что рукопожатие произошло без вмешательства со стороны злоумышленником.

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

Another Полезная ссылка.

SO old post.

+0

Спасибо, любые предложения о том, как я могу понюхать сокет, поэтому SSL_accept() все равно найдет все необходимые байты? –

+0

Звучит довольно легко для меня. – EJP

Смежные вопросы