Saltar al contenido

En el servidor Jetty, ¿cómo puedo obtener el certificado de cliente utilizado cuando se requiere autenticación de cliente?

Estate atento porque en esta sección vas a encontrar el resultado que buscas.Este post ha sido probado por nuestros expertos para asegurar la calidad y exactitud de nuestro post.

Solución:

Actualizado en agosto de 2019: para la versión Jetty 9.4.20.v20190813.

Los certificados se agregan a los objetos de solicitud (como HttpServletRequest), mediante un personalizador de HttpConfiguration.

Específicamente, SecureRequestCustomizer.

Su código para usar esto sería el siguiente (desplácese hacia abajo)…

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);

Con este SecureRequestCustomizer en su lugar, puede acceder a varias piezas sobre la conexión SSL desde el HttpServletRequest.getAttribute(String) llamadas usando lo siguiente attribute nombres

javax.servlet.request.X509Certificate

un array de java.security.cert.X509Certificate[]

javax.servlet.request.cipher_suite

el nombre de cadena del conjunto de cifrado. (igual que lo que se devuelve de javax.net.ssl.SSLSession.getCipherSuite())

javax.servlet.request.key_size

entero de la key longitud en uso

javax.servlet.request.ssl_session_id

Representación de cadena (hexagonal) de la ID de sesión SSL activa

Hay una propiedad de solicitud de servlet estándar: javax.servlet.request.X509Certificate

Devuelve un array de certificados X509.

Usamos esto para obtener el nombre y buscar el DN del certificado:

x509Cert[0].getSubjectX500Principal().getName()

Si entiendes que te ha resultado de ayuda nuestro post, sería de mucha ayuda si lo compartes con el resto juniors así nos ayudas a difundir nuestra información.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *