Este ejemplo completo le ayuda a familiarizarse con la configuración de OpenID Connect (OIDC) en
Liberty dado que le muestra desde la instalación de Liberty hasta la configuración de OpenID Connect. El resultado
es que las aplicaciones cliente pueden verificar la identidad de un usuario basándose en la autenticación de
un proveedor de OpenId Connect.
Acerca de esta tarea
Puede configurar un proveedor de OpenId Connect y OpenID Connect Relying Party realizando estos
pasos en el procedimiento siguiente:
- Instale Liberty.
- Cree dos servidores.
- Descargue e instale una aplicación de prueba proporcionada por
IBM® que incluya el
servlet Snoop.
- Configure proveedor de OpenId Connect y OpenID Connect Relying Party para que se comuniquen entre sí
utilizando el nombre de host localhost.
- Inicie la sesión.
- Edite las configuraciones de proveedor de OpenId Connect y OpenID Connect Relying Party para utilizar
el nombre de host real.
- Inicie la sesión.
Los puntos siguientes explican qué está ocurriendo en el procedimiento:
- El servidor de OpenID Connect Relying Party y el servidor de proveedor de OpenId Connect se ejecutan
en el mismo sistema.
- El servidor de OpenID Connect Relying Party y el servidor de proveedor de OpenId Connect se inician con el
nombre de host localhost. Lo hacen para superar los problemas que el sistema pueda tener con un host
que permite conexiones externas en sí mismo.
- Se codifica un registro basado en archivos en el archivo server.xml para el
servidor de proveedor de OpenId Connect. Contiene dos entradas para el nombre de usuario y la contraseña. Una
es para el nombre de usuario
Jackson y la contraseña Password. La otra es para el nombre de usuario
Andrea y la contraseña Password. En un entorno de producción,
en lugar de ello puede utilizar, por ejemplo, el registro de usuarios LDAP dado que los usuarios
se autentican en un proveedor de OpenId Connect. Se necesita un proveedor de OpenId Connect para tener un
registro. OpenID
Connect Relying Party no necesita un registro porque confía los artefactos de usuario, por ejemplo
señales, que obtiene del proveedor de OpenId Connect.
- Los almacenes de claves predeterminados utilizan contraseñas de texto sin formato. Puede generar
una contraseña codificada y cifrada utilizando el securityUtility.
- Para simplificar, se utiliza el algoritmo de firma HS256. El soporte para el algoritmo de firma
HS256 no es obligatorio en la especificación de
OpenID Connect. Muchos proveedores de OpenID no soportan el algoritmo de firma HS256.
- Ponga la aplicación de prueba en el directorio dropins por conveniencia, pero
evite esta práctica en un entorno de producción.
- El rastreo de OIDC está habilitado para que pueda ver el archivo trace.log
del servidor si encuentra errores.
Procedimiento
- Instale WebSphere
Liberty.
- Descargue el archivo .zip de
WebSphere
Liberty
de WASdev
en un nuevo directorio para la instalación.
- Extraiga el archivo descargado.
unzip wlp-webProfile7-17.0.0.4.zip
Las vías de acceso que siguen en este ejemplo son relativas al directorio que ha creado
para la instalación.
- Descargue la aplicación predeterminada Liberty de ejemplo.
Esta aplicación predeterminada está en el archivo libertyDefaultApplication.ear y
contiene el servlet Snoop que se utiliza en este procedimiento de ejemplo.
- Instale las características de cliente Liberty OpenID Connect y proveedor Liberty OpenID Connect.
Ejecute los mandatos siguientes desde el directorio
wlp/bin:
installUtility install openidConnectClient-1.0
installUtility install openidConnectServer-1.0
- Cree los servidores de Liberty.
- Cree el servidor de OpenID Connect Relying Party.
Ejecute el mandato siguiente desde el directorio wlp/bin:
server create Liberty_RP
- Cree el servidor de proveedor de OpenId Connect.
Ejecute el mandato siguiente desde el directorio wlp/bin:
server create Liberty_OP
- Cree el archivo server.xml para el servidor de OpenID Connect Relying Party.
- Vaya al directorio wlp/usr/servers/Liberty_RP.
- Sustituya el contenido del archivo server.xml con el contenido siguiente:
<server description="Liberty_RP">
<featureManager>
<feature>openidConnectClient-1.0</feature>
<feature>appSecurity-2.0</feature>
</featureManager>
<!-- Para acceder a este servidor desde cualquier lugar distinto de localhost o de la dirección de bucle de retorno, añada un atributo de host al elemento siguiente, p.ej. host="*" -->
<httpEndpoint httpPort="9081" httpsPort="9444" id="defaultHttpEndpoint"/>
<keyStore id="defaultKeyStore" password="Password"></keyStore>
<openidConnectClient id="RP"
clientId="oidcclient"
clientSecret="password"
authorizationEndpointUrl="https://localhost:9443/oidc/endpoint/OP/authorize"
tokenEndpointUrl="https://localhost:9443/oidc/endpoint/OP/token" >
</openidConnectClient>
<logging traceSpecification="*=info:
com.ibm.ws.security.*=all:com.ibm.ws.webcontainer.security.*=all:com.ibm.oauth.*=all:com.ibm.wsspi.security.oauth20.*=all:com.ibm.ws.transport.http.*=all:org.apache.http.cli.e.nt.*=all" traceFileName="trace.log" maxFileSize="20" maxFiles="10" traceFormat="BASIC" />
</server>
- Cree el archivo server.xml para el proveedor de OpenId Connect.
- Cambie al directorio wlp/usr/servers/Liberty_OP.
- Sustituya el contenido del archivo server.xml con el contenido siguiente:
<server description="Liberty_OP">
<featureManager>
<feature>openidConnectServer-1.0</feature>
<feature>appSecurity-2.0</feature>
</featureManager>
<!-- Para acceder a este servidor desde cualquier lugar distinto de localhost o de la dirección de bucle de retorno, añada un atributo de host al elemento siguiente, p.ej. host="*" -->
<httpEndpoint httpPort="9080" httpsPort="9443" id="defaultHttpEndpoint"/>
<keyStore id="defaultKeyStore" password="Password"/>
<basicRegistry>
<user name="Jackson" password="Password"/>
<user name="Andrea" password="Password"/>
</basicRegistry>
<openidConnectProvider id="OP" oauthProviderRef="oauth"/>
<oauthProvider id="oauth">
<localStore>
<!-- El patrón de URL de redirección predeterminado es: https://<nombrehost>:<puertossl>/oidcclient/redirect/<openidConnectClientID> -->
<client name="oidcclient" secret="password" scope="openid" redirect="https://localhost:9444/oidcclient/redirect/RP" />
</localStore>
</oauthProvider>
<!-- Para otorgar a todos los usuarios autenticados acceso al recurso protegido de OIDC, otórgueles el rol oauth autenticado -->
<oauth-roles>
<authenticated>
<special-subject type="ALL_AUTHENTICATED_USERS"/>
</authenticated>
</oauth-roles>
<logging traceSpecification="*=info:
com.ibm.ws.security.*=all:com.ibm.ws.webcontainer.security.*=all:com.ibm.oauth.*=all:com.ibm.wsspi.security.oauth20.*=all:com.ibm.ws.transport.http.*=all:org.apache.http.client.*=all" traceFileName="trace.log" maxFileSize="20" maxFiles="10" traceFormat="BASIC" />
</server>
- Cree las claves y los almacenes de claves predeterminados.
Ejecute los mandatos siguientes desde el directorio
wlp/bin:
server start Liberty_RP
server stop Liberty_RP
server start Liberty_OP
server stop Liberty_OP
- Añada el certificado de firmante para el servidor Liberty_OP al servidor Liberty_RP como un
certificado de confianza.
- Exporte el certificado personal del almacén de claves del servidor Liberty_OP.
- Cambie al directorio wlp/usr/servers/Liberty_OP/resources/security.
- Exporte el certificado personal predeterminado del servidor Liberty_OP:
keytool -exportcert -keystore key.jks -storepass Password -alias default -file libertyOP.cer
Este certificado personal predeterminado del servidor Liberty_OP es un certificado de firmante.
- Importe el certificado de firmante del servidor Liberty_OP en el almacén de claves del servidor
Liberty_RP.
- Copie el archivo libertyOP.cer en el directorio
wlp/usr/servers/Liberty_RP/resources/security.
- Cambie al directorio wlp/usr/servers/Liberty_RP/resources/security.
- Ejecute el mandato siguiente para realizar la importación:
keytool -importcert -keystore key.jks -storepass Password -alias libertyop -file libertyOP.cer -noprompt
- Opcional: Vea el almacén de claves del servidor Liberty_RP:
keytool -list -v -keystore key.jks -storepass Password
- Instale la aplicación predeterminada de Liberty en el servidor Liberty_RP.
Copie el archivo libertyDefaultApplication.ear que ha descargado en un paso anterior
en el directorio wlp/usr/servers/Liberty_RP/dropins.
- Inicie el servidor Liberty_OP y el servidor Liberty_RP.
Ejecute los mandatos siguientes desde el directorio
wlp/bin:
server start Liberty_RP
server start Liberty_OP
- Abra la página de inicio de sesión del servidor Liberty_RP.
- En la barra de direcciones del navegador, especifique el URL del servidor Liberty_RP:
http://localhost:9081/snoop
- Pulse Intro.
Se visualiza una ventana de inicio de sesión.
Importante: Si obtiene un aviso de navegador que indica que la conexión no es segura, realice los pasos en el navegador
para permitir la conexión.
- Inicie la sesión en el servidor Liberty_OP y autorice el servidor Liberty_RP.
- Autentique el usuario en el servidor Liberty_OP.
- Inicie la sesión con Jackson como nombre de usuario y Password
como contraseña.
- Puse Inicio de sesión.
La página
Permitir que el cliente acceda a los datos siguientes se visualiza con
la entrada openid seleccionada.
- Autorice el servidor Liberty_OP para permitir que el servidor Liberty_RP acceda a
la información personal del usuario.
Pulse Permitir una vez o Permitir, recordar mi decisión.
Importante: Si obtiene un aviso de navegador que indica que la conexión no es segura, realice los pasos en el navegador
para permitir la conexión. Puede que reciba este aviso porque los almacenes de claves
utilizados por el elemento httpEndpoint en el servidor Liberty_RP y el servidor Liberty_OP
contienen sólo certificados autofirmados.
Si inicia la sesión correctamente, el servlet Snoop se muestra en la página
Snoop Servlet - Request/Client Information. Importante: Para iniciar la
sesión de nuevo, complete al menos una de las siguientes opciones:
- Inicie la sesión desde un producto de navegador diferente.
- Borre las cookies en el navegador actual y siga los pasos anteriores relacionados con el inicio de sesión.
- Cierre todas las ventanas del navegador que ha utilizado para iniciar la sesión, vuelva a abrir
el navegador e inicie la sesión.
- Reinicie el servidor Liberty_RP y, a continuación, siga los pasos anteriores relacionados con el
inicio de sesión.
- Califique por completo los nombres de servidor.
- Cambie el nombre de host localhost en el archivo server.xml del servidor
Liberty_RP a su nombre completo.
- Edite el archivo wlp/usr/servers/Liberty_RP/server.xml.
- Añada el atributo siguiente al elemento httpEndpoint: host="*".
- Cambie los atributos authorizationEndpointUrl y tokenEndpointUrl del elemento
openidConnectClient para utilizar el nombre de host de servidor del nombre de host localhost.
El
código de ejemplo siguiente especifica el nombre de host de servidor completo:
<openidConnectClient id="RP"
clientId="oidcclient"
clientSecret="password"
authorizationEndpointUrl="https://wks1.acme.com:9443/oidc/endpoint/OP/authorize"
tokenEndpointUrl="https://wks1.acme.com:9443/oidc/endpoint/OP/token" >
</openidConnectClient>
- Guarde el archivo.
Cuando guarde el archivo, se desencadenará un cambio de configuración de Liberty
para que no tenga que reiniciar el servidor.
- Cambie el nombre de host localhost en el archivo server.xml del servidor
Liberty_OP a su nombre completo.
- Edite el archivo wlp/usr/servers/Liberty_OP/server.xml.
- Añada el atributo siguiente al elemento httpEndpoint: host="*".
- Cambie el atributo de redirección del elemento del cliente (oauthProvider/localStore/client)
para utilizar el nombre de host de servidor completo en lugar del nombre de host
localhost.
El código de ejemplo siguiente especifica el nombre de host de servidor
completo:
<client name="oidcclient" secret="password" scope="openid" redirect="https://wks1.acme.com:9444/oidcclient/redirect/RP" />
- Guarde el archivo.
Cuando guarde el archivo, se desencadenará un cambio de configuración de Liberty
para que no tenga que reiniciar el servidor.
- Abra la página de inicio de sesión utilizando el nombre de host completo.
- En la barra de direcciones de un navegador, especifique el URL que incluye el servidor
Liberty_RP:
http://<nombre_host>:9081/snoop
- Pulse Intro.
Se visualiza una ventana de inicio de sesión.
Importante: Si obtiene un aviso de navegador que indica que la conexión no es segura, realice los pasos en el navegador
para permitir la conexión.
- Inicie la sesión en el servidor Liberty_OP y autorice el servidor Liberty_RP.
- Autentique el usuario en el servidor Liberty_OP.
- Inicie la sesión con Jackson como nombre de usuario y Password
como contraseña.
- Puse Inicio de sesión.
La página
Permitir que el cliente acceda a los datos siguientes se visualiza con
la entrada openid seleccionada.
- Autorice el servidor Liberty_OP para permitir que el servidor Liberty_RP acceda a
la información personal del usuario.
Pulse Permitir una vez o Permitir, recordar mi decisión.
Importante: Si obtiene un aviso de navegador que indica que la conexión no es segura, realice los pasos en el navegador
para permitir la conexión. Puede que reciba este aviso porque los almacenes de claves
utilizados por el elemento httpEndpoint en el servidor Liberty_RP y el servidor Liberty_OP
contienen sólo certificados autofirmados.
Si inicia la sesión correctamente, el servlet Snoop se muestra en la página
Snoop Servlet - Request/Client Information.
Resultados
Tiene un servidor de Liberty que contiene el servlet Snoop que está protegido por
un OpenID Connect Relying Party. OpenID Connect Relying Party utiliza el proveedor de OpenId Connect
para la autenticación.
Tabla 1. Pregunta sobre los resultadosPregunta |
Respuesta |
¿Por qué está la aplicación de prueba protegida por OpenID Connect Relying Party aunque el
servlet Snoop y la aplicación de prueba libertyDefaultApplication no se mencionan en la
configuración de OpenID Connect? |
La aplicación de prueba se ha protegido porque el archivo web.xml contiene
una restricción de seguridad que cualquier contenedor
habilitado para la seguridad de Java™ EE soporta. Cuando
OpenID Connect Relying Party se ejecuta en Liberty, de forma predeterminada
Relying Party intenta autorizar todas las solicitudes a cualquier URL que tiene restricciones
de seguridad. Dado que la aplicación de prueba tiene restricciones de seguridad en el
URL que se está utilizando, Relying Party autoriza las solicitudes. |