Java实现-SSL oneway和twoway握手交换机

时间:2015-05-30 04:04:18

标签: java ssl

对于一个客户端和服务器,可以在运行时切换单向和双向SSL握手吗? (服务器必须在运行之前设置身份验证模式)。

我想到的是分别使用两个端口进行单向和双向SSL连接。有没有更好的方法在运行时切换它们(使用一个端口)?

更复杂的情况是每个客户都可能在单向和双向方案之间切换。如果服务器选择一个方案,那么任何客户端都必须使用这样的方案。如何处理以下场景?当鲍勃需要双向时,爱丽丝想要单向。

谢谢。

1 个答案:

答案 0 :(得分:2)

当然可以。要切换到双向身份验证,请在服务器端执行以下操作:

  • 致电SSLSocket.setNeedClientAuth(true)
  • 致电SSLSocket.getSession().invalidate()以使当前会话无效
  • 然后致电getSession().getPeerCertificates()或朋友(a)执行新的握手,(b)获取客户证书。

请注意,您必须两次致电getSession()。不要试图优化'离开了。

编辑您的更复杂的案例'没有意义。它与客户的需求无关'去做。这是服务器是否需要或需要客户端身份验证的问题。一旦对特定客户端进行了身份验证,它就不需要回退到该客户端的非身份验证。请注意,客户端身份验证适用于具有该客户端的整个SSLSession,而不仅仅适用于当前连接。特别是你的陈述:

  

如果服务器选择一个方案,那么任何客户端都必须使用这种方案。

完全不正确。此处needClientAuth设置适用于单个SSLSocket,而不适用于每个客户的每个SSLSocket