Можно ли заказать наборы шифров со стороны сервера в 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
объект из является вторичным.