Невозможно принять только TLS 1.2 с boost:: asio?

Поэтому я пытаюсь изменить третью сторону (libtorrent), чтобы она принимала только протокол TLS 1.2.

Часть настройки контекста SSL:

boost::shared_ptr<context> ctx = boost::make_shared<context>(boost::ref(m_ses.get_io_service()), context::tlsv12)

ctx->set_options(context::default_workarounds
        | boost::asio::ssl::context::no_sslv2
        | boost::asio::ssl::context::no_sslv3
        | boost::asio::ssl::context::no_tlsv1
        | boost::asio::ssl::context::no_tlsv1_1
        | boost::asio::ssl::context::single_dh_use);

Однако, когда я тестирую свое соединение с OpenSSL s_client, кажется, что оно все еще принимает соединение tls 1.0 и tls 1.1.

Есть ли что-то, что я делаю неправильно?

РЕДАКТИРОВАТЬ: добавлено "| boost::asio::ssl::context::no_tlsv1_1" в параметры. Я понял, что имел в виду старое справочное руководство по бустингу. Однако это ничего не изменило.

РЕДАКТИРОВАТЬ: я просто понимаю, что я не упомянул, что это соединение является двусторонним/взаимным соединением аутентификации. Не уверен, что это что-то меняет.


person jimmy    schedule 23.06.2015    source источник
comment
Вам нужно показать больше кода. В частности, как вы убедитесь, что ваш ctx применяется ко всем соединениям   -  person sehe    schedule 23.06.2015
comment
Я не знаю, как показать вам это в хорошем смысле. Но давайте предположим, что это применяется ко всем соединениям, правильный ли этот код?   -  person jimmy    schedule 23.06.2015
comment
Я так думаю. Дело в том, что есть слишком много вещей, которые могут быть неправильными, кроме этого, чтобы даже начать думать. См. никто больше не пишет тестовые примеры. Сделайте это в SSCCE, и вы можете обнаружить проблему самостоятельно. В противном случае, мы здесь, чтобы перепроверить   -  person sehe    schedule 23.06.2015
comment
Думаю, это должно быть моим следующим шагом. Я надеялся, что мне не придется копаться в сторонней библиотеке;)   -  person jimmy    schedule 23.06.2015
comment
Какая сторонняя библиотека?   -  person sehe    schedule 23.06.2015
comment
github.com/libtorrent/libtorrent   -  person jimmy    schedule 23.06.2015
comment
Ахахахаха. Тогда лучше добавить это к вашему вопросу. Вы ctx модифицируете существующий код библиотеки или библиотека вызывает take ctx? Есть ли образец, на который можно дать ссылку?   -  person sehe    schedule 23.06.2015
comment
Это код библиотеки, который я модифицирую. Я изменил две вещи в коде: метод ввода в конструктор изменился с sslv23 на tlsv12, а в опции добавлены no_sslv3 и no_tlsv1. Вот и все. Я просто предполагаю, что библиотека использует этот ctx для всех соединений.   -  person jimmy    schedule 23.06.2015
comment
Кажется справедливым предположением. Было бы ясно с самого начала, если бы вы сказали, что я изменил строку ### файла ?????.cpp, чтобы она читалась так:   -  person sehe    schedule 23.06.2015
comment
@jimmy - что вы видите с s_client или сервером, который заставляет вас полагать, что любая версия TLS принята (пожалуйста, простите мое невежество).   -  person jww    schedule 24.06.2015
comment
во-первых, вы можете попробовать: github.com/arvidn/libtorrent (ссылка, которую вы разместили, является очень старое зеркало). во-вторых, вы можете протестировать примеры программ boost.asio с использованием SSL, чтобы увидеть, сможете ли вы заставить их принимать только TLS 1.2.   -  person Arvid    schedule 24.06.2015
comment
@jww У меня нет большого опыта работы с s_client, но я вижу, что когда я использую tls1 , tls1.1 и tls1.2 s_client покажет мне сертификаты сервера, а также используемые шифры. Когда я использую SSL3, он не сможет выполнить рукопожатие и скажет мне, что использовал чипер: (Нет)   -  person jimmy    schedule 24.06.2015
comment
@Arvid На самом деле я использую код из источника, который вы упомянули. Я разместил свой предыдущий комментарий со своего телефона и быстро погуглил, чтобы получить ссылку, видимо, я ошибся. :)   -  person jimmy    schedule 24.06.2015
comment
@Arvid Я посмотрю пример кода boost:asio, чтобы увидеть, возможно ли это.   -  person jimmy    schedule 24.06.2015
comment
@jimmy, нам нужно больше подробностей, потому что эта ветка пока основана исключительно на ваших комментариях о предполагаемых проблемах. У меня есть прокси-сервер с поддержкой HTTPS, который я ограничиваю TLS 1.2 с помощью boost 1.58, и хотя у меня есть клиенты, пытающиеся подключиться, пытаясь использовать такие вещи, как SSL3, эти подключения терпят неудачу. Вы делаете что-то не так, и вам нужно опубликовать больше кода.   -  person    schedule 25.06.2015
comment
@TechnikEmpire Я не уверен, какие части кода имеет смысл показывать, не делая это слишком много. Как я упоминал ранее, это лишь незначительные изменения, которые я внес в существующую библиотеку. Вы можете ознакомиться с исходным кодом github.com/arvidn/libtorrent. Рассматриваемый код находится в Torrent.cpp в районе строки 1600.   -  person jimmy    schedule 25.06.2015
comment
@TechnikEmpire Когда я тестирую соединение с openssl s_client, я также вижу, что SSLv3 ограничен, а TLS1 и TLS1.1 — нет. Вы когда-нибудь тестировали эти два, в частности?   -  person jimmy    schedule 25.06.2015
comment
@jimmy нет, на самом деле нет. Я рекомендую вам создать простую программу для целей тестирования, потому что никто не собирается копаться в коде libtorrents, чтобы помочь вам найти ответ. Я заинтригован вашим вопросом сейчас, но в настоящее время у вас нет минимального примера для тестирования, и лично я недостаточно заинтригован, чтобы создать его. :)   -  person    schedule 25.06.2015
comment
@TechnikEmpire Честно говоря, я не ожидал, что кто-то действительно заглянет в код libtorrent, это было единственное, что у меня было, пока у меня не было времени сделать более простую тестовую настройку.   -  person jimmy    schedule 25.06.2015
comment
@jimmy Я опубликовал ответ, который может помочь вам или нет.   -  person    schedule 25.06.2015
comment
Давайте продолжим обсуждение в чате.   -  person    schedule 25.06.2015


Ответы (2)


В asio::ssl::context нет константы для TLS1.2. Но для этого вы можете использовать нативный API openssl:

#include <openssl/ssl.h>
long ssl_disallowed = SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3 | SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_1 | SSL_OP_NO_TLSv1_2;
ssl_disallowed &= ~SSL_OP_NO_TLSv1_2;
SSL_CTX_set_options(ctx.native_handle(), ssl_disallowed);
person PSIAlt    schedule 24.06.2015
comment
Поскольку boost 1.58 фактически содержит константы для TLS1.2 boost.org/doc/libs/1_58_0/doc/html/boost_asio/reference/ - person jimmy; 24.06.2015

Это полный выстрел в темноте, но попробуйте следующее:

Попробуйте создать строку шифров, специфичных для TLS 1.2, а затем вызовите

char* TLS_12_CIPHERS = "... list of ciphers specific to TLS 1.2";
SSL_CTX_set_cipher_list(ctx->native_handle(), TLS_12_CIPHERS);

Затем установите параметр в контексте (при условии, что это контекст сервера), чтобы сервер мог выбирать, какие шифры он хочет использовать, а не клиент.

SSL_CTX_set_options(ctx->native_handle(), SSL_OP_CIPHER_SERVER_PREFERENCE);

Можно подумать, что boost::asio::ssl позаботится об этом за вас, указав параметры no_X, но я не уверен. Как я уже сказал, это выстрел в темноту, но явная настройка контекста с использованием API OpenSSL таким образом должна обеспечить выполнение условий, которые вам нужны. Даже если где-то каким-то образом установлен какой-то конфликтующий параметр, разрешающий соединения без TLS 1.2, с этими параметрами любое соединение без TLS 1.2 завершится ошибкой «нет общего шифра».

Что касается того, почему ваш сервер даже объявляет, что соединения, отличные от 1.2, приемлемы, неизвестно, но одно из возможных объяснений заключается в том, что существует контекст по умолчанию, который рекламирует это. Вот почему Сехе сделал акцент на «применении ко всем соединениям».

Вот список TLS 1.2. специальные шифры.

person Community    schedule 25.06.2015