在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。
自 JDK 12 以来,行为似乎发生了变化。至少在JDK 17中,默认情况下服务器建议的顺序似乎是首选的。无论如何,使用 API 的正确方法是
SSLParameters parameters = serverSocket.getSSLParameters();
parameters.setUseCipherSuitesOrder(true);
serverSocket.setSSLParameters(parameters);
关键的部分是打电话给setSSLParameters()
。从何处获取SSLParameters
对象是次要的。