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

设置请求客户端身份验证的嵌入式Jetty服务器非常容易:只需添加以下语句即可:SslContextFactory.setNeedClientAuth(true);

配置服务器时访问ssl上下文。在服务器的信任库中具有其证书的任何客户端都将能够建立与服务器的TLS连接。

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

回答:

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连接的各种内容。

java.security.cert.X509Certificate[]

的数组

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

使用的密钥长度的整数

活动的SSL会话ID的字符串表示形式(十六进制)

以上是 在Jetty服务器中,当需要进行客户端身份验证时,如何获取所使用的客户端证书? 的全部内容, 来源链接: utcz.com/qa/399605.html

回到顶部