mutua instalar certificado autenticacion java ssl embedded-jetty authentication

java - instalar - autenticacion mutua



En el servidor Jetty, ¿cómo puedo obtener el certificado del cliente utilizado cuando se requiere la autenticación del cliente? (2)

Es muy fácil configurar un servidor Jetty incrustado que solicita autenticación de cliente: uno solo necesita agregar la declaración SslContextFactory.setNeedClientAuth (true); al contexto ssl cuando se configura el servidor. Cualquier cliente que tenga su certificado en el almacén de confianza del servidor podrá establecer una conexión TLS con el servidor.

Sin embargo, necesito saber qué cliente de todos los posibles clientes de confianza está haciendo actualmente una solicitud; en otras palabras, necesito saber el certificado del cliente utilizado en esta conexión, en particular en el controlador. ¿Alguien sabe cómo acceder a este certificado o si es posible?


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

Devuelve una matriz de X509Certificates.

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

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


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 (desplazarse 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(); sslContextFactory.setKeyStorePath("/path/to/keystore"); sslContextFactory.setKeyStorePassword("changeme"); sslContextFactory.setKeyManagerPassword("changeme"); sslContextFactory.setTrustStorePath("/path/to/truststore"); sslContextFactory.setTrustStorePassword("changeme"); sslContextFactory.setExcludeCipherSuites( "SSL_RSA_WITH_DES_CBC_SHA", "SSL_DHE_RSA_WITH_DES_CBC_SHA", "SSL_DHE_DSS_WITH_DES_CBC_SHA", "SSL_RSA_EXPORT_WITH_RC4_40_MD5", "SSL_RSA_EXPORT_WITH_DES40_CBC_SHA", "SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA", "SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA"); // === 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 de las HttpServletRequest.getAttribute(String) usando los siguientes nombres de atributos.

javax.servlet.request.X509Certificate

una matriz de java.security.cert.X509Certificate []

javax.servlet.request.cipher_suite

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

javax.servlet.request.key_size

Entero de la longitud de la clave en uso

javax.servlet.request.ssl_session_id

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