Можно ли заказать наборы шифров со стороны сервера в Java?

В Java документах указано, что:

public final void setUseCipherSuitesOrder​(boolean honorOrder)

Устанавливает, должно ли учитываться предпочтение локальных наборов шифров.

Параметры: honorOrder - должен ли учитываться порядок локальных наборов шифров в #getCipherSuites при рукопожатии SSL/TLS/DTLS.

Заказ шифровальных костюмов:

String[] cs = new String[]{
 "TLS_RSA_WITH_AES_256_GCM_SHA384",
 "TLS_RSA_WITH_AES_256_CBC_SHA256",
 "TLS_RSA_WITH_AES_256_CBC_SHA"
  };

Если я устанавливаю параметры сокета как:

SSLServerSocket.getSSLParameters().setUseCipherSuitesOrder(true);
SSLServerSocket.setEnabledProtocols(....);
SSLServerSocket.setEnabledCipherSuites(cs);

используя # nmap -sT -p 465 host_address --script ssl-enum-ciphers.nse результат:

PORT    STATE SERVICE
465/tcp open  smtps
| ssl-enum-ciphers:
|   TLSv1.2:
|     ciphers:
|       TLS_RSA_WITH_AES_256_CBC_SHA (rsa 4096) - A
|       TLS_RSA_WITH_AES_256_CBC_SHA256 (rsa 4096) - A
|       TLS_RSA_WITH_AES_256_GCM_SHA384 (rsa 4096) - A
|     compressors:
|       NULL
|     cipher preference: client
|_  least strength: A

Порядок шифрования по-прежнему определяется клиентом: cipher preference: client, Можно ли установить приоритет по серверу? Использование JDK 12.

1 ответ

Похоже, что поведение изменилось с JDK 12. По крайней мере, с JDK 17 порядок, предлагаемый сервером, кажется предпочтительным по умолчанию. В любом случае, правильный способ использования API будет

          SSLParameters parameters = serverSocket.getSSLParameters();
    parameters.setUseCipherSuitesOrder(true);
    serverSocket.setSSLParameters(parameters);

Важная часть - позвонитьsetSSLParameters(). Где вы получаетеSSLParametersобъект из является вторичным.

Другие вопросы по тегам