2015-05-30 39 views
0

对于一个客户端和服务器,它可以在运行时切换单向和双向SSL握手吗? (服务器在运行之前必须设置认证模式)。Java实现-SSL单向和双向握手开关

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

更复杂的情况是每个客户都可能在单向和双向方案之间翻转。如果服务器选择一个方案,那么任何客户都必须使用这样的方案。如何处理以下情况? Alice需要单向,而Bob需要双向。

谢谢。

+0

您不妨使用SSLEngine来更好地控制事物。 – ZhongYu

+0

@ bayou.io为什么?这是三行代码与SSLSocket。绝对没有必要去使用SSLEngine的100倍复杂度,因此对于这个问题使用NIO。 “可能也是如此”是表达需要改变程序的整个I/O基础的一种非常傲慢的方式。 – EJP

回答

2

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

  • 呼叫SSLSocket.setNeedClientAuth(true)
  • 呼叫SSLSocket.getSession().invalidate()当前会话
  • 然后调用getSession().getPeerCertificates()或朋友无效(一)执行新的握手和(b)获得客户证书。

请注意,您必须拨打getSession()两次。不要试图“优化”这一点。

编辑您的'更复杂的情况'没有意义。它与客户想要做的事无关。这是服务器是否需要客户端身份验证的问题。一旦对特定客户端进行了身份验证,则无需为该客户端退回非身份验证。请注意,客户端身份验证适用于具有该客户端的整个SSLSession,而不仅仅适用于当前连接。特别是你的这个声明:

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

是完全不正确的。 needClientAuth设置在这里适用于单个SSLSocket,而不是每个客户端的每个SSLSocket

+0

非常感谢!很有帮助! – frogcd