当前位置: 首页 > 面试题库 >

在Jetty服务器中,当需要进行客户端身份验证时,如何获取所使用的客户端证书?

上官季
2023-03-14
问题内容

设置请求客户端身份验证的嵌入式Jetty服务器非常容易:只需添加以下语句即可:SslContextFactory.setNeedClientAuth(true);
配置服务器时访问ssl上下文。在服务器的信任库中具有其证书的任何客户端都将能够建立与服务器的TLS连接。

但是,我需要知道所有可能的受信任客户端中的哪个客户端当前正在发出请求;换句话说,我需要知道在此连接中使用的客户端证书,尤其是在处理程序中。有谁知道如何访问此证书,或者甚至可以访问?


问题答案:

2019年8月更新: Jetty 9.4.20.v20190813版本。

证书由HttpConfiguration

Customizer添加到Request对象(例如HttpServletRequest)中。

具体来说,就是SecureRequestCustomizer。

您要使用的代码如下(向下滚动)…

Server server = new Server();

// === HTTP Configuration ===
HttpConfiguration http_config = new HttpConfiguration();
http_config.setSecureScheme("https");
http_config.setSecurePort(8443);
http_config.setOutputBufferSize(32768);
http_config.setRequestHeaderSize(8192);
http_config.setResponseHeaderSize(8192);
http_config.setSendServerVersion(true);
http_config.setSendDateHeader(false);

// === Add HTTP Connector ===
ServerConnector http = new ServerConnector(server,
    new HttpConnectionFactory(http_config));
http.setPort(8080);
http.setIdleTimeout(30000);
server.addConnector(http);

// === Configure SSL KeyStore, TrustStore, and Ciphers ===
SslContextFactory sslContextFactory = new SslContextFactory.Server();
sslContextFactory.setKeyStorePath("/path/to/keystore");
sslContextFactory.setKeyStorePassword("changeme");
sslContextFactory.setKeyManagerPassword("changeme");
sslContextFactory.setTrustStorePath("/path/to/truststore");
sslContextFactory.setTrustStorePassword("changeme");
// OPTIONAL - for client certificate auth (both are not needed)
// sslContextFactory.getWantClientAuth(true)
// sslContextFactory.setNeedClientAuth(true)

// === SSL HTTP Configuration ===
HttpConfiguration https_config = new HttpConfiguration(http_config);
https_config.addCustomizer(new SecureRequestCustomizer()); // <-- HERE

// == Add SSL Connector ===
ServerConnector sslConnector = new ServerConnector(server,
    new SslConnectionFactory(sslContextFactory,"http/1.1"),
    new HttpConnectionFactory(https_config));
sslConnector.setPort(8443);
server.addConnector(sslConnector);

通过使用此SecureRequestCustomizer,您可以HttpServletRequest.getAttribute(String)使用以下属性名称从调用中访问有关SSL连接的各种内容。

javax.servlet.request.X509Certificate

java.security.cert.X509Certificate[]
的数组

javax.servlet.request.cipher_suite

密码套件的字符串名称。(与从返回的内容相同javax.net.ssl.SSLSession.getCipherSuite()

javax.servlet.request.key_size

使用的密钥长度的整数

javax.servlet.request.ssl_session_id

活动的SSL会话ID的html" target="_blank">字符串表示形式(十六进制)



 类似资料:
  • 问题内容: 我需要从使用客户端证书进行身份验证的服务器请求URL,但是找不到为我的应用程序执行此操作的方法。 我的问题是我正在使用的Java客户端具有本地可用的证书文件,但是由于PC的限制,它将在其上运行,因此无法在密钥库中安装证书。 简而言之,我只是希望能够明确指定要用于我要检索的URL的证书。 有什么建议? 问题答案: 目前尚不清楚您所讨论的限制是什么。更具体地说,我不确定您认为本地证书文件和

  • 问题内容: 我想使用带有身份验证的其余api。我正在尝试包括标头,但没有得到任何回应。它抛出的输出通常是在没有身份验证时抛出的。谁能建议我一些解决方案。下面是我的代码 问题答案: 该请求模块将使您的生活更轻松。现在,它包括“ 基本身份验证”作为选项,因此您不必自己构建标题。 安装请求执行

  • 我不熟悉SSL和证书。我一直在做关于客户端证书认证的研究。我看过这个和wiki。 因此,如果我必须为我的B2B REST服务实现客户端证书身份验证解决方案,我应该执行以下操作 要求客户端生成自己的私钥,并为其公钥生成证书(CA 颁发?)。通过电子邮件或 USB 闪存盘发送该证书。 在服务器端将客户端的公共证书导入信任存储区并启用客户端身份验证 在握手期间,客户端会出示其证书并进行身份验证,因为服务

  • 问题内容: 我需要导入证书,以便向Spring Boot应用程序中的外部服务发出http请求。 我该如何设置Spring Boot来做到这一点? 那里有很多信息,但我发现所有这些都令人困惑。似乎我可能只需要创建类似“ truststore.jks”密钥库的内容并导入正确的证书,然后将一些条目添加到我的application.properties中即可。 问题答案: 打开您的终端或 回答所有问题。在

  • 授权服务器为进行客户端身份验证的目的,为Web应用客户端创建客户端凭据。授权服务器被鼓励考虑比客户端密码更强的客户端身份验证手段。Web应用程序客户端必须确保客户端密码和其他客户端凭据的机密性。 授权不得向本地应用程序或基于用户代理的应用客户端颁发客户端密码或其他客户端凭据用于客户端验证目的。授权服务器可以颁发客户端密码或其他凭据给专门的设备上特定安装的本地应用程序客户端。 当客户端身份验证不可用

  • 在向令牌端点发起请求时,机密客户端或其他被颁发客户端凭据的客户端必须如2.3节所述与授权服务器进行身份验证。客户端身份验证用于: 实施刷新令牌和授权码到它们被颁发给的客户端的绑定。当授权码在不安全通道上向重定向端点传输时,或者 当重定向URI没有被完全注册时,客户端身份验证是关键的。 通过禁用客户端或者改变其凭据从被入侵的客户端恢复,从而防止攻击者滥用被盗的刷新令牌。改变单套客户端凭据显然快于撤销