问题描述
我开发了一个小型客户端和服务器,该客户端和服务器使用JSSE建立了相互认证的TLS连接。现在,假设客户端要启动连接,但是服务器拒绝连接是有正当理由的。例如,这可能是由于客户证书被吊销了。
服务器创建一个SSLSocket,现在希望通过从SSLSocket对象调用getSession来建立会话。根据JavaDoc,该方法将阻塞直到TLS握手完成。因此,从该方法返回后,服务器已经知道由于客户端证书被吊销而导致TLS握手失败。此时,创建了SSLHandshakeException,但以某种方式使其隐藏在实现内部(稍后您可以在异常跟踪中看到它)。
因此,稍后,服务器开始侦听传入的客户端请求。只有在从客户端以某种方式传入一些数据之后,服务器才会记住已创建的SSLHandshakeException并将其包装为导致Throwable的原因,并将其包装到新的SSLHandshakeException中。
所以我的问题是:尽管服务器已经知道握手失败,甚至隐藏了已经创建的SSLHandshakeException对象,但为什么服务器必须等到客户端传输一些数据之后,为什么? 在getSession方法中握手失败后,是否可以立即检查SSLHandshakeException?
也许,您是否也对涵盖TCP和TLS这类细节的文献提出了建议?
谢谢!
编辑:SSLHandshakeException的内部隐藏似乎取决于JDK。 OpenJDK 8在getSession中吃了任何IOException,如果设置了调试标志,则仅创建stdout输出。但是,我最初的观察是基于IBM JSSE2,它确实在内部保存了异常,以便以后可以引发它。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)