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

问题描述

通过设置SslContextFactory.setNeedClientAuth(true)设置了请求客户端身份验证的嵌入式Jetty服务器之后,当客户端连接到Jetty服务器时,两种情况下身份验证成功还是失败,我如何获取客户端的证书信息?

我已经阅读了reference,但是我认为这仅适用于成功的身份验证。 webassets.exceptions.FilterError: Program file not found: sass似乎仅在成功验证客户端的证书信息之后执行

但是我想知道的是,当码头服务器进行身份验证时,无论成功与否,有什么方法可以获取客户端的证书信息。然后,即使Jetty服务器不信任此客户端,我也可以获取客户端的证书信息。

解决方法

欢迎来到stackoverflow。

设置了SslContextFactory.setNeedClientAuth(true)时,这意味着您正在设置Java级别javax.net.ssl.SSLParameters.setNeedClientAuth(true)

这会影响新连接的Java级TLS / SSL协商,并迫使它们要求有效的客户端证书。

如果失败,则连接会由Java本身在TLS / SSL握手级别终止,并且客户端甚至不会发送HTTP请求,并且Jetty不会参与此确定。

毫无疑问,SecureRequestCustomizer中不会处理TLS / SSL级客户端身份验证失败的连接。

如果您希望看到成功的和失败的客户端超过了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信息)