#openssl
#openssl
Вопрос:
Я хочу протестировать свой клиент на тестовом сервере, поэтому я использую команду OpenSSL s_server. Цель состоит в том, чтобы настроить сервер на выбор только 1 набора шифров, который я настраиваю. Таким образом, я могу протестировать различные наборы шифров, отправленные клиентом. Я не могу изменить список наборов шифров на стороне клиента.
Для запуска сервера я использую:
`{` openssl s_server -accept 50000 -cert ../server/server_certificate.pem -key ../server/private_key.pem -CAfile ca_certificate.pem -cipher ECDHE-RSA-AES256-GCM-SHA384 -serverpref -state -debug -status_verbose }
Чтобы проверить, выбирает ли сервер настроенный набор шифров, я запускаю клиент как
openssl s_client -connect 3.135.190.131:50000 -cert ../client/client_certificate1.pem -key ../client/private_key.pem -CAfile ca_certificate.pem
Но когда я начинаю подключать клиент к серверу, сервер выбирает: TLS_AES_256_GCM_SHA384 вместо настроенного: ECDHE-RSA-AES256-GCM-SHA384
Кроме того, я проверил трассировку, и клиент действительно отправляет ECDHE-RSA-AES256-GCM-SHA384 в списке набора шифров.
Можете ли вы предположить, что может быть не так в команде на стороне сервера?
Ответ №1:
Ваш сервер и клиент хотят использовать протокол TLS 1.3, который имеет свой собственный строгий набор ciphersuites, который не включает ECDHE-RSA-AES256-GCM-SHA384
.
Они могут быть изменены с -ciphersuites
аргументом на s_server
. Набор ciphersuites является дополнением к шифрам TLS 1.2, установленным -ciphers
. Согласно [справочной странице] (https://www.openssl.org/docs/man1.1.1/man1/openssl-s_server.html:
-cipher val
Это позволяет изменять список шифровальных наборов TLSv1.2 и ниже, используемых сервером. Этот список объединяется с любыми TLSv1.3 ciphersuites, которые были настроены. Когда клиент отправляет список поддерживаемых шифров, используется первый клиентский шифр, также включенный в список серверов. Поскольку клиент указывает порядок предпочтений, порядок списка шифров сервера не имеет значения. Смотрите команду ciphers для получения дополнительной информации.
-ciphersuites val
Это позволяет изменять список шифров TLSv1.3, используемых сервером. Этот список объединяется с любыми TLSv1.2 и ниже ciphersuites, которые были настроены. Когда клиент отправляет список поддерживаемых шифров, используется первый клиентский шифр, также включенный в список серверов. Поскольку клиент задает порядок предпочтений, порядок списка шифров сервера не имеет значения. Для получения дополнительной информации см. Команду ciphers. Формат этого списка представляет собой список имен шифровальных наборов TLSv1.3, разделенный простым двоеточием («:»).
Если мы попытаемся полностью удалить шифры TLS 1.3, оставив только шифры TLS 1.2, вот что произойдет на стороне сервера:
$ openssl s_server -accept 50000 -cert node.crt -key node.key -CAfile ca.crt -cipher ECDHE-RSA-AES256-GCM-SHA384 -serverpref -state -debug -status_verbose -ciphersuites ""
Using default temp DH parameters
ACCEPT
write to 0x55c8894b0bd0 [0x55c8894c83f0] (7 bytes => 7 (0x7))
0000 - 15 03 03 00 02 02 28 ......(
SSL3 alert write:fatal:handshake failure
SSL_accept:error in error
ERROR
139842681824576:error:141FC0B5:SSL routines:tls_setup_handshake:no ciphers available:../ssl/statem/statem_lib.c:127:No ciphers enabled for max supported SSL/TLS version
shutting down SSL
CONNECTION CLOSED
На сервере не включены допустимые шифровальные наборы TLS 1.3, но и клиент, и сервер поддерживают TLS 1.3. Это приводит к сбою соединения (без понижения версии TLS).
Вместо этого вам нужно будет принудительно установить максимальную версию TLS 1.2 на одной из двух сторон. Мы можем сделать это на сервере (оставив -ciphersuites
его в покое, поскольку он больше не будет использоваться):
$ openssl s_server -accept 50000 -cert node.crt -key node.key -CAfile ca.crt -cipher ECDHE-RSA-AES256-GCM-SHA384 -serverpref -state -debug -status_verbose -no_tls1_3
...
CIPHER is ECDHE-RSA-AES256-GCM-SHA384
Secure Renegotiation IS supported
Все это более подробно описано в разделе Ciphersuites wiki.openssl.org/TLS1.3