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

问题描述 投票:0回答:1

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。

java ssl serversocket ssl-security
1个回答
1
投票

自 JDK 12 以来,行为似乎发生了变化。至少在 JDK 17 中,服务器建议的顺序似乎是默认首选。无论如何,正确的 API 使用方法是

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

关键的部分是拨打

setSSLParameters()
。从哪里获取
SSLParameters
对象是次要的。

© www.soinside.com 2019 - 2024. All rights reserved.