当前位置: 首页 > 面试题库 >

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

孙京
2023-03-14
问题内容

我在端口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的调用会尝试建立会话,并且隐式握手已完成

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



 类似资料:
  • 问题内容: 我正在将Java 1.6和netty 3.8用于HTTP / HTTPS服务器。我已经通过ssllab.com(https://www.ssllabs.com/ssltest/analyze.html)进行了SSL测试,并且得到了如下所示的密码套件的结果。 密码套件(按强度排序; 服务器无偏好 ) 但是,google.com的结果却有所不同。 https://www.ssllabs.c

  • 在我的需求规格中写着: 支持这些安全框架的TLS实现应至少实现以下密码组:TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 Java说它在Java7的TLSv1.2中提供了这个密码套件的实现。 我不熟悉安全,所以不知道如何使用它。 在我的客户端,我使用: 我从谷歌那里学到的是,客户端为服务器提供了一系列选项,服务器需要选择其中之一。如果我错了,请纠正我。 现在我想在服

  • 当启动带有ssl调试的Tomcat时,我收到以下警告。 2014年2月3日凌晨5:02:34。阿帕奇。公猫util。网jsse。JSSESocketFactory GetEnableCiphers警告:SSL引擎不支持指定的任何密码:TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 我已经在java.security文件中设置bouncyCastle作为加密提供商,并

  • 我正在Codeigniter中创建API。在这个API中,我为用户提供了一个登录函数。如果登录成功,我将在CI会话中设置用户数据,并将会话返回给用户。 现在,用户可以使用该会话ID来验证他自己的所有其他请求,如添加/更新/删除。基本上,我希望当用户发送下一个请求时,我可以根据他的会话ID验证他的凭据。 客户请求代码: 上面是一个从客户端到服务器的登录请求示例。在服务器端,服务器验证客户端提供的凭据

  • 问题内容: Singleton无法自动装配SessionBean,而ScopedProxy可以。 假设在同一应用程序中同时有100个用户有一个有效的会话,那么ScopedProxy如何确定会话的含义? 我认为ScopedProxy不会选择任何随机会话,我认为这是无稽之谈。 ScopedProxy如何决定要使用的会话? 如果0个用户拥有一个会话该怎么办?会发生吗? @Async是不同于调用Reque

  • 问题内容: 当使用带有https的hudson git插件时,如何指定密码? 问题答案: 你不能 这是git插件中的错误,但是有fork可以修复它,请参见: http://issues.hudson-ci.org/browse/HUDSON-3807