2014-12-03 4 views
3

У меня есть приложение framework, которое подключается к различным серверам в зависимости от того, как оно используется. Для соединений https используется openssl. Моя проблема заключается в том, что мне нужно знать, использует ли сервер, с которым я подключаюсь, SSL или TLS, поэтому я могу создать правильный контекст SSL. В настоящее время, если я использую неправильный контекст, пытающийся установить время соединения.Проверить протокол безопасности сервера с помощью openssl

Для TLS я использую:

SSL_CTX *sslContext = SSL_CTX_new(TLSv1_client_method()); 

Для SSL я использую:

SSL_CTX *sslContext = SSL_CTX_new(SSLv23_client_method()); 

Так есть ли способ узнать, какой протокол сервер работает до установления соединения?

Редактировать: Так как я понимаю, теперь это должно работать в любом случае, поскольку SSLv23_client_method() также содержит протокол TLS. Поэтому вопрос в том, почему это не так? Что может быть причиной тайм-аута с одним клиентским методом, но не с другим?

+0

* «Итак, вопрос в том, почему это не так?» * - укажите имя сервера или URL-адрес для тестирования. В противном случае нам недостаточно информации, чтобы помочь вам. (И, пожалуйста, не меняйте вопрос после факта. Задайте новый вопрос). – jww

+0

У меня нет доступа к серверу самостоятельно.Однако я проверю, разрешено ли мне передавать имя IP/хоста вам. Это может занять несколько дней. –

+1

OK, если вы не хотите публиковать его публично, тогда напишите мне по адресу * noloader, gmail account *. – jww

ответ

3
For SSL I use: 
SSL_CTX *sslContext = SSL_CTX_new(SSLv23_client_method()); 

TLS только текущее имя бывшего протокола SSL, то есть на самом деле TLS1.0 SSL3.1 и т.д. SSLv23_client_method фактически является наиболее совместимым способом установления соединения TLS/SSL и будет использовать лучший протокол доступный , Это означает, что он также будет создавать соединения TLS1.2, если сервер поддерживает это. Смотрите также в documentation of SSL_CTX_new:

SSLv23_method (пустот), SSLv23_server_method (недействительным), SSLv23_client_method (аннулируются)

ДУС/соединение SSL установлено с помощью этих методов может понимающих SSLv2, SSLv3, TLSv1, TLSv1. 1 и TLSv1.2.

... клиент отправит сообщения приветствия клиента TLSv1, включая расширения, и укажет, что он также понимает TLSv1.1, TLSv1.2 и разрешает отказ в SSLv3. Сервер будет поддерживать протоколы SSLv3, TLSv1, TLSv1.1 и TLSv1.2. Это лучший выбор, когда проблема совместимости.

Любые протоколы вы не хотите (как SSL3.0) можно отключить с SSL_OP_NO_SSLv3 и т.д., и с помощью SSL_CTX_set_options.

В настоящее время, если я использую неправильный контекст, пытаясь установить время соединения.

Затем либо сервер, либо ваш код поврежден. Если сервер получает соединение с протоколом, он не понимает, что он должен вернуть предупреждение «неизвестный протокол». Другие серверы просто закрывают соединение. Тайм-аут обычно происходит только со сломанным сервером или промежуточным ящиком, как старый F5 Big IP load balancer.

+0

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

1

Итак, есть способ узнать, какой протокол сервер работает до установления соединения?

Нет. Но вы должны теперь предположить его «TLS 1.0 и выше».

Как указал Штеффен, вы используете SSLv23_method и варианты контекста для реализации «TLS 1.0 и выше». Вот полный код.Вы можете использовать его в клиенте или сервере:

const SSL_METHOD* method = SSLv23_method(); 
if(method == NULL) handleFailure(); 

SSL_CTX* ctx = SSL_CTX_new(method); 
if(ctx == NULL) handleFailure(); 

const long flags = SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3 | SSL_OP_NO_COMPRESSION; 
SSL_CTX_set_options(ctx, flags); 

Теперь, есть неявное предположение о том, что здесь не очевидно; и это предположение неверно. Это предположение заключается в том, что существует версия TLS min и TLS max.

Что происходит, существует базовый уровень записи SSL/TLS, который несет полезную нагрузку протокола. Уровень записи TLS не зависит от уровня протокола и имеет собственную версию. Люди интерпретируют версию уровня TLS-записи как версию «TLS min»; и версию протокола как версию «TLS max». Большинство клиентов серверов, сайтов и служб используют его таким образом.

Однако IETF не указывает его таким образом, и браузер не использует его таким образом. Из-за этого мы недавно получили TLS Fallback Signaling Cipher Suite Value (SCSV).

Браузер правильный. Вот как его должно быть сделано:

  • попробовать TLS 1.2, используйте Fallback Signaling для обнаружения даунгрейд атаки
  • если TLS 1.2 не удается, то попробуйте TLS 1.1, используйте Fallback Signaling для обнаружения даунгрейд атаки
  • если TLS 1.1 терпит неудачу, затем попробуйте TLS 1.0, используйте Fallback Signaling для обнаружения атак с понижением рейтинга

Многие сдаются после отказа TLS 1.0. Некоторые пользовательские агенты могут продолжить работу с SSLv3.

Почему IETF не перемещается, чтобы дать нам «TLS min» и «TLS max»? Это все еще загадка. Я считаю, что данный эффективный аргумент «предположим, что клиент хочет использовать TLS 1.0, 1.2 и 1.3, но не 1.1». Я не знаю никого, кто отказывается от такой версии протокола, поэтому для меня это просто солома. (Это один из тех случаев, когда я задаюсь вопросом, влияет ли правоохранительная деятельность или национальные интересы, такие как NSA, на стандарты).

Этот вопрос недавно был поднят в Рабочей группе TLS. С TLS: prohibit <1.2 support on 1.3+ servers (but allow clients) (21 мая 2015):

Теперь может быть хорошее время, чтобы добавить (3) для TLS 1.3: есть клиент указать как наименьшую версию TLS они готовы использовать, и которые они хотят использовать. И MAC или вывести из него его так, что нельзя подделать или понизить.

Вы все еще можете обеспечить версию слоя записи TLS, и вы можете держать его не-MAC'd, поэтому он может быть подделан, чтобы вызвать раскрытие или аварии :)

Фактически, это как версии в уровне записи и клиентский протокол . Он останавливает эти глупые танцы в браузерах и другие пользовательские агенты выполняют без необходимости TLS Fallback SCSV.

Если часть миссии IETF заключается в документировании существующих практик, IETF не выполняет свою миссию.

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