ssl 在Java中可以从服务器端订购密码套件吗?

dfty9e19  于 2023-01-21  发布在  Java
关注(0)|答案(1)|浏览(161)

在Java文档中指出:
public final void setUseCipherSuitesOrder​(boolean honorOrder)
设置是否应遵循本地密码套件首选项。
参数:honorOrder -在SSL/TLS/DTLS握手期间是否应遵循#getCipherSuites中的本地密码套件顺序。
密码组的顺序:

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。

mwg9r5ms

mwg9r5ms1#

从JDK 12开始,这种行为似乎有所改变。至少在JDK 17中,默认情况下服务器建议的顺序似乎是首选的。无论如何,使用API的正确方法应该是

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

关键部分是调用setSSLParameters(),从哪里获取SSLParameters对象是次要的。

相关问题