Unofficial Content

El external object Single Sign On (SSO) es un procedimiento de autenticación desarrollado para java que permite a un usuario acceder a varios sistemas con una única instancia de autenticación, en este caso la autenticación se realizará contra AGESIC utilizando la C.I. electrónica.

com.gxc.saml.jar

Este jar es el encargado de realizar la comunicación con AGESIC, realizando el login contra mismo y utilizando el Security Assertion Markup Language (SAML).

Para configurar este jar en nuestra aplicación es necesario modificar el archivo generalProps.properties que se encuentran como file en el xpz

Archivos incluidos en xpz

  • Files (jars y archivos properties)
  • External objects
  • Web Panel

Pasos a seguir

  • Importar xpz
  • Realizar rebuild para extraer files a .\drivers
  • Modificar el archivo generalProps.properties:

Las siguientes modificaciones requieren una comunicación con AGESIC con el fin de definir todos los elementos para poder realizar el login desde nuestro SP:

  • Modificar ServiceProviderEntityId, este será nuestro proveedor de servicios (SP).
  • Modificar AssertionConsumerServiceURL, esta será la url desde donde consumiremos los assertions.
  • Modificar SingleLogoutendpoint, esta será la url donde iniciaremos el logout
  • Modificar nombre, ruta y password de certificados a utilizar (Credential, TrustStore, TrustStoreCredential)
  • Modificar PathErrorServletSSO, PathLoginServletSSO (estos serán los servlets a los cual nos redirigirá el IdP en caso de éxito o error), clave de encriptación y validación de firmas

 

  • Incluir los archivos .properties en la carpeta WEB-INF/classes
  • Modificar web.xml

Para utilizar el com.gxc.saml.jar debemos incluir en el web.xml de nuestra aplicación lo siguiente:

<servlet>
       <servlet-name>com.gxc.saml.servlet.Logout</servlet-name>
       <servlet-class>com.gxc.saml.servlet.Logout</servlet-class>   
</servlet>
                            
<servlet>
        <servlet-name>com.gxc.saml.servlet.SSO</servlet-name>
        <servlet-class>com.gxc.saml.servlet.SSO</servlet-class>   
</servlet>

<servlet-mapping>
        <servlet-name>com.gxc.saml.servlet.Logout</servlet-name>
        <url-pattern>/servlet/logout</url-pattern>
</servlet-mapping>
                            
<servlet-mapping>
        <servlet-name>com.gxc.saml.servlet.SSO</servlet-name>
        <url-pattern>/servlet/sso</url-pattern>
</servlet-mapping>

Esto nos define cuáles serán los servlets que nos redireccionará al IdP de AGESIC. Debemos tener previamente definido con AGESIC desde que SP lo invocaremos.

  • Configurar el nombre del servidor localmente para que se resuelva con el servidor local

Se debe configurar dependiendo de donde ejecuta el cliente. Por ejemplo: si voy a ejecutar Chrome desde Windows seguir paso En Windows.

-En Windows:

Editar el archivo C:\Windows\System32\drivers\etc\hosts y agregar la línea que indica que la dirección del servidor de la url de la redirección se corresponde con el equipo local (127.0.0.1). En el ejemplo, agregar:

127.0.0.1   sso.genexusconsulting.com

-En Linux:

Editar el archivo /etc/hosts  y agregar la línea que indica que la dirección del servidor de la url de la redirección se corresponde con el equipo local (127.0.0.1). En el ejemplo, agregar:

sso.genexusconsulting.com 127.0.0.1

Nota: En caso de que el servidor se encuentre dentro de una máquina virtual, la ip que se debe configurar será la ip de la misma.

  • Configurar el protocolo de acceso al servidor local (https)

En Tomcat

En el ejemplo actual, se configura el servidor Tomcat 7 para escuchar en https ( puerto 443 ) con un certificado auto firmado.

 <Connector port="443" protocol="org.apache.coyote.http11.Http11Protocol"

  maxThreads="150" SSLEnabled="true" scheme="https" secure="true"

  clientAuth="false" sslProtocol="TLS"

  keystorePass="curso_seguridad"

  keystoreFile="C:/Tomcat/certs/keyStoregenexusconsulting.com.jks"

  keyAlias="genexusconsulting.com" />

Es importante notar que se generará una excepción de seguridad en el navegador. Para fines de desarrollo, puede ser aceptada.

Nota: Generar el certificado auto firmado está fuera del alcance de este documento.

Para Tomcat 8:

<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol"

  maxThreads="150" SSLEnabled="true" scheme="https" secure="true"

  clientAuth="false" sslProtocol="TLS"

  keystorePass="curso_seguridad"

  keystoreFile="C:/cert/keyStoregenexusconsulting.com.jks"

  keyAlias="genexusconsulting.com" />

En JBoss

a) Dejar en /usr/share/jboss-as-7.1.1.Final/standalone/configuration/ el keystore keyStoregenexusconsulting.com.jks (certificado auto firmado)

b) Configurar el protocolo para que escuche en https con un certificado autofirmado:

- Para que se pueda escuchar en el puerto 443 desde la línea de comandos ejecutar las siguientes líneas:

setcap 'cap_net_bind_service=+ep' /usr/share/jboss-as-7.1.1.Final/bin/standalone.sh

setcap 'cap_net_bind_service=+ep' /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.75-2.5.4.2.el7_0.x86_64/jre-abrt/bin/java

Nota: se debe poner la dirección donde se encuentre el java instalado, no necesariamente tiene que ser la versión que especifica el documento

- Luego para configurar el servidor ir a /usr/share/jboss-as-7.1.1.Final/standalone/configuration/ y agregar/modificar en el archivo standalone.xml las siguientes líneas resaltadas:

<subsystem xmlns="urn:jboss:domain:web:1.1" default-virtual-server="default-host" native="false">

            <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="genexusconsulting.com" password="curso_seguridad" certificate-key-file="/usr/share/jboss-as-7.1.1.Final/standalone/configuration/keyStoregenexusconsulting.com.jks" protocol="TLSv1"/>

            </connector>

            <virtual-server name="default-host" enable-welcome-root="true">

                <alias name="localhost"/>

                <alias name="sso.genexusconsulting.com"/>

            </virtual-server>

</subsystem>

<socket-binding name="https" port="443"/>

  • Configurar la webapp y coincidir el directorio del servidor o realizar la redirección adecuada

En Tomcat

La webapp a donde retorna la llamada del IdP se encuentra configurada en el IdP mismo. Para que coincida con la webapp utilizada para desarrollar, se puede:

1 - Cambiar en nombre de la webapp en el IdP

2 - Cambiar el nombre de la webapp en la configuración de GeneXus

3 - Crear un Alias

Para crear un alias de la webapp, en Tomcat 7 y Tomcat 8, se debe modificar el archivo server.xml, el tag host, agregar lo siguiente

   <Context reloadable="true" privileged="true" path="/sso" docBase="SSOAGESICJavaEnvironment" />

dónde SSOAGESICJavaEnvironment es el nombre de la webapp generada por GeneXus automáticamente

En JBoss

Se deben realizar los siguientes pasos:

a) Crear en /usr/share/jboss-as-7.1.1.Final/standalone/deployments/ la carpeta TramitesUY.ear (Poner el nombre de cómo se llama la WebApp)

b) Dentro de la carpeta TramitesUY.ear poner la carpeta TramitesUY.war y crear la carpeta META-INF

c) Dentro de la carpeta META-INF se deben crear tres archivos:

- Application.xml que debe contener el siguiente código:

<?xml version="1.0" encoding="UTF-8"?>

<application xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="6" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_6.xsd">

  <display-name>TramitesUY</display-name>

  <initialize-in-order>true</initialize-in-order>

  <module>

    <web>

      <web-uri>TramitesUY.war</web-uri>

      <context-root>/sso</context-root>

    </web>

  </module>

</application>

 

- jboss-deployment-structure.xml que debe contener el siguiente código:

<?xml version="1.0" encoding="UTF-8"?>     

<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.1">

  <ear-subdeployments-isolated>true</ear-subdeployments-isolated>

 

  <deployment>

    <exclusions>

            <module name="javaee.api" />

            <module name="org.apache.xalan" />

            <module name="org.apache.xerces" />

    </exclusions>

  </deployment>

 

  <sub-deployment name="TramitesUY.war">

    <exclusions>

            <module name="javaee.api" />

            <module name="org.apache.xalan" />

            <module name="org.apache.xerces" />

    </exclusions>

    <dependencies> 

        <module name="javaee.api" > 

            <imports> 

                <exclude-set> 

                                   <path name="javax/xml/crypto"/>

                                   <path name="javax/xml/crypto/dom"/>

                                   <path name="javax/xml/crypto/dsig"/>

                                   <path name="javax/xml/crypto/dsig/keyinfo"/>

                                   <path name="javax/xml/crypto/dsig/spec"/>

                                   <path name="javax/xml/crypto/dsig/dom"/>

                                   <path name="org/apache/jcp/xml/dsig/internal"/>

                                   <path name="org/apache/jcp/xml/dsig/internal/dom"/>

                                   <path name="org/apache/xml/security"/>

                                   <path name="org/apache/xml/security/algorithms"/>

                                   <path name="org/apache/xml/security/algorithms/implementations"/>

                                   <path name="org/apache/xml/security/c14n"/>

                                   <path name="org/apache/xml/security/c14n/helper"/>

                                   <path name="org/apache/xml/security/c14n/implementations"/>

                                   <path name="org/apache/xml/security/encryption"/>

                                   <path name="org/apache/xml/security/exceptions"/>

                                   <path name="org/apache/xml/security/keys"/>

                                   <path name="org/apache/xml/security/keys/content"/>

                                   <path name="org/apache/xml/security/keys/content/keyvalues"/>

                                   <path name="org/apache/xml/security/keys/content/x509"/>

                                   <path name="org/apache/xml/security/keys/keyresolver"/>

                                   <path name="org/apache/xml/security/keys/keyresolver/implementations"/>

                                   <path name="org/apache/xml/security/keys/storage"/>

                                   <path name="org/apache/xml/security/keys/storage/implementations"/>

                                   <path name="org/apache/xml/security/resource"/>

                                   <path name="org/apache/xml/security/resource/schema"/>

                                   <path name="org/apache/xml/security/signature"/>

                                   <path name="org/apache/xml/security/signature/reference"/>

                                   <path name="org/apache/xml/security/transforms"/>

                                   <path name="org/apache/xml/security/transforms/params"/>

                                   <path name="org/apache/xml/security/transforms/implementations"/>

                                   <path name="org/apache/xml/security/utils"/>

                                   <path name="org/apache/xml/security/utils/resolver/implementations"/>

                                   <path name="org/apache/xml/security/utils/resolver"/>

                </exclude-set> 

            </imports> 

        </module>  

    </dependencies>  

  </sub-deployment>

</jboss-deployment-structure>

 

- MANIFEST.MF que debe contener lo siguiente:

Manifest-Version: 1.0

Ant-Version: Apache Ant 1.8.1

Created-By: 1.6.0_26-b03 (Sun Microsystems Inc.)

Build-Date: ${current.date}

Version: 3.0.0

 

e) Se debe quitar el siguiente JAR: nekohtmlXni-0.9.2.jar  (Toma la clase: org.cyberneko.html.HTMLConfiguration, la misma deja el atributo fParentSettings de la clase ParserConfigurationSettings en null. Esto causa el error: "javax.xml.parsers.ParserConfigurationException: Property 'http://apache.org/xml/properties/security-manager' is not recognized.")

 

NOTA IMPORTANTE:

La configuración del componente no es trivial. Requiere conocimientos de gestión de certificados digitales, y ese dependiente del servidor de aplicaciones. No todos los servidores de aplicaciones JAVA utilizan las mismas configuraciones de módulos, classpaths, keystores y truststores.

También  requiere comprender los mensajes intercambiados entre el Service Provider y el Identity Provider con el fin de realizar las configuraciones particulares de cada despliegue

Last update: February 2024 | © GeneXus. All rights reserved. GeneXus Powered by Globant