对于一个客户端和服务器,可以在运行时切换单向和双向SSL握手吗? (服务器必须在运行之前设置身份验证模式)。
我想到的是分别使用两个端口进行单向和双向SSL连接。有没有更好的方法在运行时切换它们(使用一个端口)?
更复杂的情况是每个客户都可能在单向和双向方案之间切换。如果服务器选择一个方案,那么任何客户端都必须使用这样的方案。如何处理以下场景?当鲍勃需要双向时,爱丽丝想要单向。
谢谢。
答案 0 :(得分:2)
当然可以。要切换到双向身份验证,请在服务器端执行以下操作:
SSLSocket.setNeedClientAuth(true)
SSLSocket.getSession().invalidate()
以使当前会话无效getSession().getPeerCertificates()
或朋友(a)执行新的握手,(b)获取客户证书。请注意,您必须两次致电getSession()
。不要试图优化'离开了。
编辑您的更复杂的案例'没有意义。它与客户的需求无关'去做。这是服务器是否需要或需要客户端身份验证的问题。一旦对特定客户端进行了身份验证,它就不需要回退到该客户端的非身份验证。请注意,客户端身份验证适用于具有该客户端的整个SSLSession,而不仅仅适用于当前连接。特别是你的陈述:
如果服务器选择一个方案,那么任何客户端都必须使用这种方案。
完全不正确。此处needClientAuth
设置适用于单个SSLSocket
,而不适用于每个客户的每个SSLSocket
。