如何解决进行身份验证时如何在码头服务器中获取客户端证书
通过设置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层不执行任何客户端证书身份验证,并且您现在可以在自己的代码中执行这些相同的检查。这不会很好地工作。
所以您可以选择...
-
setNeedClientAuth(true)
-对连接进行身份验证,如果客户端证书失败,则终止连接。客户端未创建HTTP请求。 -
setNeedClientAuth(false)
-所有连接成功,不执行任何身份验证,从而导致您可以处理HTTP请求。
如果您需要第1点,但第2点没有用,请考虑使用org.eclipse.jetty.io.ssl.SslHandshakeListener
并仅注意成功/失败的结果。
创建此侦听器的自己的实现,并将其作为Bean添加到服务器连接器。您将获得该事件源的活动javax.net.ssl.SSLEngine
传递,您可以在该事件中询问连接失败后要获得的各种详细信息(甚至可以获取尝试连接的客户端的IP信息)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。