执行身份验证时如何在码头服务器中获取客户端的证书



通过设置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层不执行客户端证书身份验证,您现在可以在自己的代码中执行这些相同的检查了。这不会很好用。

所以你可以选择。。。

  1. setNeedClientAuth(true)-连接已通过身份验证,如果客户端证书失败,则终止连接。客户端未创建HTTP请求
  2. setNeedClientAuth(false)-所有连接都成功,不执行身份验证,从而产生HTTP请求,然后您可以处理这些请求

如果您需要第1点,但第2点不可行,请考虑使用org.eclipse.jetty.io.ssl.SslHandshakeListener,并只关注成功/失败的结果。

创建您自己的侦听器实现,并将其作为bean添加到服务器连接器中。您将获得该事件源的活动javax.net.ssl.SSLEngine,在那里您可以询问失败连接的各种详细信息(您甚至可以获得尝试连接的客户端的IP信息(

最新更新