如何指定在SSL会话中使用的密码套件

我在端口443上创建了一个套接字,如下行:

socket = (SSLSocket) factory.createSocket(hostName, port);

然后,我想在此套接字中查看启用的密码套件,我使用了:

String[] enCiphersuite=socket.getEnabledCipherSuites();

System.out.println("Enabled ciphersuites are: "+Arrays.toString(enCiphersuite));

然后,我只选择一个我希望我的应用程序在与远程服务器建立握手时使用的密码套件。我做了以下事情:

String pickedCipher[] ={"TLS_RSA_WITH_AES_128_CBC_SHA"}; 

socket.setEnabledCipherSuites(pickedCipher);

System.out.println("ciphersuite set to: "+Arrays.toString(pickedCipher));

然后我进行了握手,并检查了会话密码套件:

socket.startHandshake();

System.out.println("Session ciphersuite is"+socket.getSession().getCipherSuite() );

但是我发现握手后在上一个打印输出语句中打印的密码的名称(据我了解,这是会话中实际使用的密码)不是我之前使用的密码

setEnabledCipherSuites()

为什么我仍然看不到我选择的密码套件是二手密码套件?而且,getEnabledCipherSuites()setEnabledCipherSuites发现列表未更改为我设置的列表之后,我还尝试将其打印出来。我不确定何时打印启用的密码套件,此密码套件列表是否取决于Java且始终相同?还是取决于客户端或服务器?有人可以解释吗?

握手之前,我只有以下几行:

SSLSocketFactory factory = HttpsURLConnection.getDefaultSSLSocketFactory(); 

SSLSocket socket=null;

try {

socket = (SSLSocket) factory.createSocket(hostName, port);

socket.setSoTimeout(15000);

socket.startHandshake(); //handshake

.

.

回答:

我发现我在setEnableCipherSuite()之前添加了socket.getsession(),以便在设置它们之前打印出启用的密码。当我删除它时,密码已设置。这是为什么

SSLSocketJavaDoc中所述:

可以通过以下三种方式之一启动此连接上的初始握手:

  • 调用开始显式开始握手的startHandshake,或
  • 尝试在此套接字上读取或写入应用程序数据会导致隐式握手,或者

如果在呼叫getSession()之前进行呼叫setEnabledCipherSuite(),则在尝试设置启用的密码套件时已经完成了握手,因此已经选择了该会话的密码套件。

以上是 如何指定在SSL会话中使用的密码套件 的全部内容, 来源链接: utcz.com/qa/423831.html

回到顶部