Puede desarrollar un proveedor de customPasswordEncryption para que tenga
decisiones de autorización personalizadas para aplicaciones Java™ Platform,
Enterprise Edition (J2EE) implementando la interfaz
com.ibm.wsspi.security.crypto.CustomPasswordEncryption que se proporciona
en el servidor de Liberty.
Acerca de esta tarea
Nota: Los pasos opcionales siguientes son para dar soporte a
los programas de utilidad de la línea de mandatos. Si el proveedor
tiene previsto dar soporte solo al entorno de tiempo de ejecución de
servidores, estos pasos se pueden omitir.
EL proveedor
customPassworedEncryption
consta de los tres archivos siguientes:
- El archivo de paquete OSGi, que contiene el ejecutable.
- El archivo de manifiesto de característica, que define la
característica de usuario del proveedor
customPasswordEncryption. Este archivo contiene
la ubicación de los paquetes y atributos necesarios de la
característica y el archivo de manifiesto de extensión, si está
empaquetado. Esta información es consumida por el tiempo de ejecución
del servidor.
- EL archivo de manifiesto de extensión, que define los archivos de
paquete necesarios y el nombre de la clase de implementación del
proveedor customPasswordEncryption. Este archivo
es opcional y es necesario para dar soporte a los programas de
utilidad de la línea de mandatos.
Procedimiento
- Cree un componente OSGi que proporcione un servicio que implemente la interfaz
com.ibm.wsspi.security.crypto.CustomPasswordEncryption.
La interfaz CustomPasswordEncryption define tres métodos,
decrypt, que el tiempo de ejecución del servidor Liberty invoca para descifrar la serie,
encrypt, que el tiempo de ejecución del servidor Liberty invoca para cifrar la serie e
initialize, que está reservado para uso futuro.
En el ejemplo siguiente, se utilizan anotaciones de servicios declarativos de OSGi:
package com.mycompany.custom;
import org.osgi.service.component.ComponentContext;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.ConfigurationPolicy;
import org.osgi.service.component.annotations.Deactivate;
import org.osgi.service.component.annotations.Modified;
import com.ibm.wsspi.security.crypto.CustomPasswordEncryption;
import com.ibm.wsspi.security.crypto.EncryptedInfo;
import com.ibm.wsspi.security.crypto.PasswordDecryptException;
import com.ibm.wsspi.security.crypto.PasswordEncryptException;
/**
*/
@Component(service = CustomPasswordEncryption.class,
immediate = true,
name = "com.mycompany.CustomPasswordEncryptionImpl",
configurationPolicy = ConfigurationPolicy.OPTIONAL,
property = { "someKey=someValue" })
public class CustomPasswordEncryptionImpl implements CustomPasswordEncryption {
@Activate
protected synchronized void activate(ComponentContext cc, Map<String, Object> props) {
}
@Modified
protected synchronized void modify(Map<String, Object> props) {
}
@Deactivate
protected void deactivate(ComponentContext cc) {}
/**
* La operación de cifrado toma una serie con codificación UTF-8 en forma de un byte[].
* El byte[] se genera a partir de String.getBytes("UTF-8"). Se devuelve un byte[]
* cifrado de la implementación en el objeto EncryptedInfo.
* Además, se devuelve un alias de clave lógica en EncryptedInfo que
* se vuelve a pasar al método de descifrado para determinar qué clave se ha utilizado para
* cifrar esta contraseña. El tiempo de ejecución de WebSphere Application Server no
* conoce el algoritmo o la clave que se ha utilizado para cifrar los datos.
*
* @param decrypted_bytes
* @return com.ibm.wsspi.security.crypto.EncryptedInfo
* @throws com.ibm.wsspi.security.crypto.PasswordEncryptException
**/
@Override
public EncryptedInfo encrypt(byte[] input) throws PasswordEncryptException {
byte[] output = null;
String key = null;
try {
:
<do some encryption>
:
return new EncryptedInfo(output, key);
} catch (Exception e) {
throw new PasswordEncryptException("Exception is caught", e);
}
}
/**
* La operación de descifrado toma el objeto EncryptedInfo que contiene un byte[]
* y el alias de clave lógico y lo convierte al byte[] descifrado. El
* tiempo de ejecución de WebSphere Application Server convertirá el byte[] en una serie
* utilizando una nueva serie (byte[], "UTF-8");
*
* @param info
* @return byte[]
* @throws PasswordEncryptException
* @throws com.ibm.wsspi.security.crypto.PasswordDecryptException
**/
@Override
public byte[] decrypt(EncryptedInfo info) throws PasswordDecryptException {
byte[] input = info.getEncryptedBytes();
String key = info.getKeyAlias();
byte[] output = null;
try {
:
<do some decryption>
:
return output;
} catch (Exception e) {
throw new PasswordEncryptException("Exception is caught", e);
}
}
/**
* Esto está reservado para uso futuro y actualmente el
* tiempo de ejecución de WebSphere Application Server no lo llama.
*
* @param initialization_data
**/
@SuppressWarnings("rawtypes")
@Override
public void initialize(Map initialization_data) {}
}
- Empaquete el componente en un paquete OSGi que forme parte de la característica de usuario. Asegúrese de
que el paquete incluye el manifiesto de servicio OSGi.
El ejemplo siguiente muestra el contenido del manifiesto de servicio OSGi:
<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="com.mycompany.custom.CustomPasswordEncryptionImpl" configuration-policy="optional" immediate="true" activate="activate" deactivate="deactivate" modified="modify">
<implementation class="com.mycompany.custom.CusomPasswordEncryptionImpl"/>
<service>
<provide interface="com.ibm.wsspi.security.crypto.CustomPasswordEncryption"/>
</service>
<property name="<someKey>" type="String" value="<someValue>"/>
</scr:component>
- Asegúrese de que el archivo de manifiesto de característica
incluye contenido del subsistema OSGi con start-phase:="SERVICE_EARLY". Si
el paso opcional se ha completado, la ubicación del archivo de
manifiesto de extensión está en la cabecera
Subsystem-Content. Por ejemplo:
Manifest-Version: 1.0
IBM-Feature-Version: 2
IBM-ShortName: customPasswordEncryption-1.0
Subsystem-Type: osgi.subsystem.feature
Subsystem-Version: 1.0.0
Subsystem-ManifestVersion: 1.0
Subsystem-SymbolicName: customPasswordEncryption-1.0;visibility:=public
Subsystem-Content:
com.mycompany.custom; version="[1,1.0.100)"; start-phase:="SERVICE_EARLY", customEncryption.jar; type=file; \
location:="bin/tools/extensions/ws-customPasswordEncryption/customEncryption.jar”
Subsystem-Description: Cifrado de la contraseña personalizada
MyCompany
- Una vez instalada la característica en la ubicación de la extensión del producto de usuario, configure el archivo server.xml con el nombre de la característica.
<featureManager>
...
<feature>usr:customPasswordEncryption-1.0</feature>
</featureManager>
Para verificar que la instalación se ha realizado correctamente
para el entorno de tiempo de ejecución del servidor, verifique que el
mensaje CWWKS1850I se ha registrado en el
archivo message.log.
- Opcional: Cree el archivo de manifiesto de extensión, que es
necesario para conectar el proveedor
customPasswordEncryption a los programas de
utilidad de la línea de mandatos como, por ejemplo, SecurityUtility. El
archivo de manifiesto de extensión es un archivo JAR, que contiene el
archivo MANIFEST.MF. Las cabeceras necesarias
del manifiesto de la extensión son:
- Require-Bundle: Define la lista de pauqetes, que
se deben cargar. El formato es el mismo que para el archivo de
manifiesto de paquete OSGi.
- IBM-ImplementationClass: Define la clase de
implementación, que implementa la interfaz
com.ibm.wsspi.security.crypto.CustomPasswordEncryption.
A continuación aparece un archivo MANIFEST.MF
de ejemplo
Require-Bundle: com.mycompany.custom; version="[1,1.0.100)"; location="usr/extension/lib"
IBM-ImplementationClass:
com.mycompany.custom.CusomPasswordEncryptionImpl
Utilice el mandato
jar para empaquetar el
archivo de manifiesto de extensión. Por ejemplo:
jar cfm customEncryption.jar MANIFEST.MF
Coloque el archivo JAR en wlp/bin/tools/extensions/ws-customPasswordEncryption.
Asegúrese de que la ubicación del archivo de manifiesto de extensión
está en la sección de la cabecera Subsystem-Content
del archivo de manifiesto de característica.
Estos archivos deben estar en directorios específicos. A
continuación se describe la relación de los archivos:
Figura 1. Archivos del proveedor customPassworedEncryption
- Opcional: Si el paso 5 se ha completado, puede verificar que la
instalación se ha realizado correctamente utilizando el mandato
siguiente de los programas de utilidad de la línea de mandatos
wlp/bin/securityUtility encode --listCustom
El resultado previsto es la información de
customPasswordEncryption. Por ejemplo:
[{"name":"custom","featurename":"usr:customPasswordEncryption-1.0","description":"Cifrado
de contraseña personalizada MyCompany"}]
Asegúrese de que existen todos los archivos necesarios y que el
contenido de los archivos es preciso.