java - JBOSS 7 con dos contextos. Uno con SSL Mutual Auth y el otro solo SSL
authentication jaas (3)
Estamos teniendo un problema para configurar nuestro JBoss. Estamos intentando configurarlo para que sea posible utilizar al mismo tiempo Auth mutua y no utilizarlo. Me gusta:
https://example.com/contextA/ (Requiere autenticación mutua de SSL) https://example.com/contextB/ (Solo SSL)
¿Es posible?
Lo que podría hacer es hacer que JBoss utilice la autenticación mutua SSL o no lo haga. ¿Cómo puedo configurarlo para ser ambos al mismo tiempo?
Mi contexto Un web.xml:
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>ContextA</display-name>
<security-constraint>
<web-resource-collection>
<web-resource-name>services</web-resource-name>
<url-pattern>/*</url-pattern>
<http-method>GET</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>*</role-name>
</auth-constraint>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
<login-config>
<auth-method>CLIENT-CERT</auth-method>
</login-config>
<security-role>
<role-name />
</security-role>
</web-app>
Mi contextoA jboss-web.xml
<?xml version="1.0" encoding="UTF-8"?>
<jboss-web>
<security-domain>RequireCertificateDomain</security-domain>
</jboss-web>
ContextB web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name>ContextB</display-name>
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<trim-directive-whitespaces>true</trim-directive-whitespaces>
</jsp-property-group>
</jsp-config>
<session-config>
<session-timeout>10</session-timeout>
<cookie-config>
<http-only>true</http-only>
</cookie-config>
</session-config>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<security-constraint>
<display-name>SecureApplicationConstraint</display-name>
<web-resource-collection>
<web-resource-name>ContextB</web-resource-name>
<description>Auth applications are secured</description>
<url-pattern>/login/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<description>Only Users with roles are allowed</description>
<role-name>USER</role-name>
</auth-constraint>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
<security-constraint>
<display-name>SecureChannelConstraint</display-name>
<web-resource-collection>
<web-resource-name>Entire site is protected through SSL</web-resource-name>
<description />
<url-pattern>/contextB/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<description>Require encrypted channel</description>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
<login-config>
<auth-method>FORM</auth-method>
<realm-name>ContextBPolicy</realm-name>
<form-login-config>
<form-login-page>/login.jsp</form-login-page>
<form-error-page>/loginError.jsp</form-error-page>
</form-login-config>
</login-config>
<security-role>
<description/>
<role-name>USER</role-name>
</security-role>
</web-app>
ContextB jboss-web.xml
<?xml version="1.0" encoding="UTF-8"?>
<jboss-web>
<security-domain>java:/jaas/ContextBPolicy</security-domain>
</jboss-web>
Contenido de standalone.xml
<security-domain name="ContextBPolicy">
<authentication>
<login-module code="org.ContextBLoginModule" flag="required"/>
</authentication>
</security-domain>
(...)
<security-domain name="RequireCertificateDomain">
<authentication>
<login-module code="CertificateRoles" flag="required">
<module-option name="securityDomain" value="RequireCertificateDomain"/>
<module-option name="verifier" value="org.jboss.security.auth.certs.AnyCertVerifier"/>
<module-option name="usersProperties" value="file:c:/tmp/my-users.properties"/>
<module-option name="rolesProperties" value="file:c:/tmp/my-roles.properties"/>
</login-module>
</authentication>
<jsse keystore-password="changethis" keystore-url="file:c:/tmp/localhost.jks" truststore-password="changethis" truststore-url="file:c:/tmp/cacerts.jks"/>
</security-domain>
(...)
<subsystem xmlns="urn:jboss:domain:web:1.1" default-virtual-server="default-host" native="false">
<configuration>
<jsp-configuration x-powered-by="false"/>
</configuration>
<connector name="http" protocol="HTTP/1.1" scheme="http" socket-binding="http"/>
<connector name="https" protocol="HTTP/1.1" scheme="https" socket-binding="https" secure="true">
<ssl name="ssl" key-alias="localhost" password="changethis" certificate-key-file="../standalone/configuration/localhost.jks" verify-client="require" ca-certificate-file="../standalone/configuration/cacerts.jks" truststore-type="JKS"/>
</connector>
<virtual-server name="default-host" enable-welcome-root="true">
<alias name="localhost"/>
<alias name="example.com"/>
</virtual-server>
</subsystem>
Es posible, ya que desea configurar diferentes tipos de autenticación para diferentes aplicaciones web.
Por favor, corrija el valor de verify-client
para want
:
<connector name="https" ...>
<ssl .. verify-client="want" .../>
</connector>
Adicional
De acuerdo con la documentación de JBoss relacionada con el atributo verify verify-client
: http://docs.jboss.org/jbossweb/7.0.x/config/ssl.html
Establézcalo en "true"
si desea que la pila SSL requiera una cadena de certificados válida del cliente antes de aceptar una conexión. Seleccione "want"
si desea que la pila SSL solicite un Certificado de cliente, pero que no falle si no se presenta uno.
Es correcto que si verify-client=”true”
JBoss requiere un certificado. Pero si accede a un certificado cuando verify-client="want"
JBOSS debe requerir un certificado de cliente. Si un hermano contiene un certificado de cliente y una aplicación está protegida por la autenticación de certificado de cliente (CLIENT-CERT en web.xml), debería ser exitosa.
Puede hacerlo definiendo un dominio que requiera un certificado:
<security-realm name="CertRequiredRealm">
<authentication>
<truststore path="mytruststore.jks" password="mytruststorepassword"/>
</authentication>
</security-realm>
Luego ponga su aplicación web en ese ámbito:
en WEB-INF / web.xml:
<login-config>
<auth-method>CLIENT-CERT</auth-method>
<realm-name>CertRequiredRealm</realm-name>
</login-config>
En mi opinión, es imposible hacer esto basado en el punto final http.
La razón es que el apretón de manos SSL / TLS ocurre ANTES de que el cliente envíe su solicitud http al servidor.
¡El punto final (ej. /contextA
) reside en esa solicitud http!
Al inicio de la comunicación SSL / TLS, solo está disponible el nombre de host (por ejemplo, example.com
) (y solo si el cliente tiene SNI habilitada).
Entonces necesitarás 2 nombres de host diferentes para esto. Por ejemplo, contexta.example.com
y contextb.example.com