openssl 1.0.2, как заставить сервер выбирать только набор шифров
У меня есть клиентский сервер, который использует opensl 1.0.2j, и хочу заставить сервер использовать только следующие шифры.
ECDHE-RSA-AES256-GCM-SHA384
ECDHE-RSA-AES256-SHA384
ECDHE-ECDSA-AES256-GCM-SHA384
ECDHE-ECDSA-AES256-SHA384
ECDH-RSA-AES128-GCM-SHA256
ECDH-RSA-AES128-SHA256
ECDH-ECDSA-AES128-GCM-SHA256
ECDH-ECDSA-AES128-SHA256
DHE-DSS-AES256-GCM-SHA384
DHE-DSS-AES256-SHA256
DHE-RSA-AES256-GCM-SHA384
DHE-RSA-AES256-SHA256
DHE-DSS-AES128-GCM-SHA256
DHE-RSA-AES128-GCM-SHA256
DHE-RSA-AES128-SHA256
DHE-DSS-AES128-SHA256
Мой код на стороне сервера будет выглядеть ниже.
method = SSLv23_server_method();
ctx = SSL_CTX_new(method);
SSL_CTX_set_cipher_list(ctx, "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDH-RSA-AES128-GCM-SHA256:ECDH-RSA-AES128-SHA256:ECDH-ECDSA-AES128-GCM-SHA256:ECDH-ECDSA-AES128-SHA256:DHE-DSS-AES256-GCM-SHA384:DHE-DSS-AES256-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-SHA256:DHE-DSS-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-SHA256:DHE-DSS-AES128-SHA256");
SSL_CTX_set_ecdh_auto(ctx, 1);
SSL_CTX_use_certificate_file(ctx, certFilePath, SSL_FILETYPE_PEM);
SSL_CTX_use_PrivateKey_file(ctx, privKeyPath, SSL_FILETYPE_PEM)
SSL_accept()
Последний шаг ssl_accept завершается с
here'error:1408A0C1:SSL routines:ssl3_get_client_hello:no shared cipher'
У меня есть проверка ошибок для каждого вызова ssl в приведенном выше коде и для ясности цели не поставить весь код. Если я использую "TLSv1.2:!ADH:!NULL" для SSL_CTX_set_cipher_list(), он работает нормально.
Изменить: сгенерированный ключ является RSA:4096. Нужно ли по-разному генерировать ключи для ECDH/ECDHE/DHE?
Не могли бы вы помочь мне выяснить, почему это не удается и как я могу решить эту проблему?
Дайте мне знать, если вам нужна дополнительная информация.
Спасибо Нага
1 ответ
Основываясь на этом коде, вы не устанавливаете параметры DH, поэтому любой из них DHE-*
сертификаты не будут работать. Кроме того, статический параметр для ECDH (не ECDHE) не установлен, поэтому нет ECDH-*
Шифры будут использоваться либо. Это оставляет только:
ECDHE-RSA-AES256-GCM-SHA384
ECDHE-RSA-AES256-SHA384
ECDHE-ECDSA-AES256-GCM-SHA384
ECDHE-ECDSA-AES256-SHA384
Но из этих 4-х шифров можно использовать только два, поскольку у вас есть сертификат RSA (первые два шифра) или сертификат ECC (последние два шифра). Скорее всего, это сертификат RSA, который оставляет:
ECDHE-RSA-AES256-GCM-SHA384
ECDHE-RSA-AES256-SHA384
Так как вы получаете no shared cipher
вполне вероятно, что ваш неизвестный клиент не поддерживает ни один из этих двух шифров.
Если я использую "TLSv1.2:!ADH:!NULL" для SSL_CTX_set_cipher_list(), он работает нормально.
С OpenSSL 1.0.2 в общей конфигурации я вижу, что этот набор также включает следующие шифры (пропуская все DH, ECDH-... как прежде):
AES256-GCM-SHA384
AES256-SHA256
ECDHE-RSA-AES128-GCM-SHA256
ECDHE-RSA-AES128-SHA256
AES128-GCM-SHA256
AES128-SHA256
Таким образом, вполне вероятно, что ваш неизвестный клиент использует любой из этих шифров для успешного подключения. Чтобы узнать больше об этом, вам нужно посмотреть на конкретного клиента и, возможно, его конфигурацию.