通过设置SslContextFactory.setNeedClientAuth(true(设置了一个请求客户端身份验证的嵌入式Jetty服务器后,当客户端连接到Jetty服务器时,无论身份验证成功还是失败,我如何获取客户端的证书信息?
我已经阅读了这篇参考文献,但我认为这只适用于身份验证成功的情况。SecureRequestCustomizer.customize(...)
似乎只有在客户端的证书信息被成功验证之后才执行。
但我想知道的是,当jetty服务器进行身份验证时,是否有任何方法可以获取客户端的证书信息,无论是成功还是失败。然后我可以获得客户端的证书信息,即使这个客户端不受jetty服务器的信任。
欢迎来到stackoverflow。
当您设置了SslContextFactory.setNeedClientAuth(true)
时,意味着您正在设置Java级别javax.net.ssl.SSLParameters.setNeedClientAuth(true)
。
这会影响新连接的Java级别TLS/SSL协商,并迫使它们需要有效的客户端证书。
如果失败,连接将由Java本身在TLS/SSL握手级别终止,客户端甚至不会发送HTTP请求,Jetty也没有参与此确定。
毫无疑问,您已经注意到,未通过TLS/SSL级别客户端身份验证的连接不会在SecureRequestCustomizer
中进行处理。
如果您希望看到成功的和失败的客户端通过TLS/SSL握手级别并到达您的各种HTTP处理程序,则必须关闭SslContextFactory.setNeedClientAuth(true)
设置。但这意味着Java JVM的TLS/SSL层不执行客户端证书身份验证,您现在可以在自己的代码中执行这些相同的检查了。这不会很好用。
所以你可以选择。。。
setNeedClientAuth(true)
-连接已通过身份验证,如果客户端证书失败,则终止连接。客户端未创建HTTP请求setNeedClientAuth(false)
-所有连接都成功,不执行身份验证,从而产生HTTP请求,然后您可以处理这些请求
如果您需要第1点,但第2点不可行,请考虑使用org.eclipse.jetty.io.ssl.SslHandshakeListener
,并只关注成功/失败的结果。
创建您自己的侦听器实现,并将其作为bean添加到服务器连接器中。您将获得该事件源的活动javax.net.ssl.SSLEngine
,在那里您可以询问失败连接的各种详细信息(您甚至可以获得尝试连接的客户端的IP信息(