gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 09:09:20 25 4
gpt4 key购买 nike

在通过设置SslContextFactory.setNeedClientAuth(true)设置了一个请求客户端认证的嵌入式Jetty服务器后,客户端连接到jetty服务器时,认证成功和失败两种情况下如何获取客户端的证书信息?

我读过这个reference但我认为这仅适用于身份验证成功。 SecureRequestCustomizer.customize(...) 好像是客户端的证书信息认证成功后才执行的

但是我想知道的是有没有办法在jetty server做认证的时候获取客户端的证书信息,不管是成功还是失败。然后即使这个客户端不被 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,您可以在其中查询连接失败后的各种详细信息(您甚至可以获取尝试连接的客户端)

关于ssl - 进行身份验证时如何在jetty服务器中获取客户端证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63387400/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com