customPasswordEncryption-Provider entwickeln

Sie können einen customPasswordEncryption-Provider entwickeln, um angepasste Berechtigungsentscheidungen für J2EE-Anwendungen (Java™ Platform, Enterprise Edition) (J2EE) durch Implementierung der im Liberty-Server bereitgestellten Schnittstelle com.ibm.wsspi.security.crypto.CustomPasswordEncryption zu treffen.

Informationen zu diesem Vorgang

Anmerkung: Die folgenden optionalen Schritte beziehen sich auf die Unterstützung der Befehlszeilendienstprogramme. Wenn der Provider nur die Serverlaufzeitumgebung unterstützen möchte, können diese Schritte übersprungen werden.
Der customPassworedEncryption-Provider setzt sich aus den folgenden drei Dateien zusammen:
  • OSGi-Bundledatei, die die ausführbare Datei enthält.
  • Featuremanifestdatei, die das Benutzerfeature des customPasswordEncryption-Providers definiert. Diese Datei enthält die Position der erforderlichen Bundles und Attribute des Features sowie die Erweiterungsmanifestdatei, sofern diese gepackt ist. Diese Informationen werden von der Serverlaufzeitumgebung verarbeitet.
  • Erweiterungsmanifestdatei, die die erforderlichen Bundledateien und den Namen der Implementierungsklasse des customPasswordEncryption-Providers definiert. Diese Datei ist optional und für die Unterstützung der Befehlszeilendienstprogramme erforderlich.

Vorgehensweise

  1. Erstellen Sie eine OSGi-Komponente, die einen Service bereitstellt, der die Schnittstelle com.ibm.wsspi.security.crypto.CustomPasswordEncryption implementiert.

    Die Schnittstelle CustomPasswordEncryption definiert drei Methoden: decrypt (wird von der Liberty-Serverlaufzeit aufgerufen, um die Zeichenfolge zu entschlüsseln), encrypt (wird von der Liberty-Serverlaufzeit aufgerufen, um die Zeichenfolge zu verschlüsseln) und initialize (für eine zukünftige Verwendung reserviert).

    Im folgenden Beispiel werden Annotationen für OSGi Declarative Services verwendet:
    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) {}
    
        /**
         * Die Verschlüsselung verwendet eine mit UTF-8 codierte Zeichenfolge in Form eines byte[].
         * Das byte[] wird von String.getBytes("UTF-8") generiert. Die Implementierung
         * im EncryptedInfo-Objekt gibt ein verschlüsseltes byte[] zurück.
         * Außerdem wird ein logischer Schlüsselalias in EncryptedInfo zurückgegeben,
         * der an die Verschlüsselungsmethode zurückübergeben wird, um festzustellen, mit welchem
         * Schlüssel dieses Kennwort verschlüsselt wurde. Der
         * WebSphere Application Server-Laufzeitumgebung ist nicht bekannt, mit welchem
         * Algorithmus oder Schlüssel die Daten verschlüsselt wurden.
         * 
         * @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);
            }
        }
    
        /**
         * Die Entschlüsselung verwendet das EncryptedInfo-Objekt mit dem byte[]
         * und dem Alias des logischen Schlüssels und wandelt es in das
         * entschlüsselte byte[] um. Die WebSphere Application Server-Laufzeitumgebung
         * wandelt das byte[] * mit new String (byte[], "UTF-8") in eine Zeichenfolge um.
         * 
         * @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);
            }
        }
    
        /**
         * Die folgende Zeile ist für eine zukünftige Verwendung reserviert und wird
         * derzeit nicht von der WAS-Laufzeitumgebung aufgerufen.
         * 
         * @param initialization_data
         **/
        @SuppressWarnings("rawtypes")
        @Override
        public void initialize(Map initialization_data) {}
    
    }
  2. Packen Sie die Komponente in ein OSGi-Bundle, das Bestandteil Ihres Benutzerfeatures ist. Vergewissern Sie sich, dass das Bundle das OSGi-Service-Manifest enthält.
    Das folgende Beispiel zeigt den Inhalt des OSGi-Service-Manifests:
    <?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>
  3. Stellen Sie sicher, dass Ihre Featuremanifestdatei den OSGi-Subsysteminhalt mit start-phase:="SERVICE_EARLY" enthält. Nach Abschluss des optionalen Schritts ist die Position der Erweiterungsmanifestdatei im Header Subsystem-Content. Beispiel:
    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: MyCompany custom password encryption
  4. Nachdem das Feature im Verzeichnis der benutzerspezifischen Produkterweiterung installiert wurde, konfigurieren Sie die Datei server.xml mit dem Featurenamen.
    <featureManager> 
       ...
       <feature>usr:customPasswordEncryption-1.0</feature>
    </featureManager>

    Vergewissern Sie sich, dass die Nachricht CWWKS1850I in der Datei message.log protokolliert wurde, um sicherzustellen, dass die Installation für die Serverlaufzeitumgebung erfolgreich war.

  5. Optional: Erstellen Sie die Erweiterungsmanifestdatei, die für die Einbindung des customPasswordEncryption-Providers in die Befehlszeilendienstprogramme, wie z. B. SecurityUtility, erforderlich ist. Die Erweiterungsmanifestdatei ist eine JAR-Datei, die die Datei MANIFEST.MF enthält. Die erforderlichen Header des Erweiterungsmanifest sind im Folgenden beschrieben:p
    • Require-Bundle: Definiert die Liste der Bundles, die geladen werden müssen. Das Format ist dasselbe wie bei der OSGi-Bundlemanifestdatei.
    • IBM-ImplementationClass: Definiert die Implementierungsklasse, die die Schnittstelle com.ibm.wsspi.security.crypto.CustomPasswordEncryption implementiert.

    Im Folgenden sehen Sie eine Beispieldatei MANIFEST.MF:

    Require-Bundle: com.mycompany.custom; version="[1,1.0.100)"; location="usr/extension/lib"
    IBM-ImplementationClass: com.mycompany.custom.CusomPasswordEncryptionImpl
    Verwenden Sie den Befehl jar, um die Erweiterungsmanifestdatei zu packen, z. B.:
    jar cfm customEncryption.jar MANIFEST.MF

    Kopieren Sie die JAR-Datei in wlp/bin/tools/extensions/ws-customPasswordEncryption. Stellen Sie sicher, dass die Position der Erweiterungsmanifestdatei im Headerabschnitt Subsystem-Content der Featuremanifestdatei angegeben ist.

    Diese Dateien müssen sich in bestimmten Verzeichnissen befinden. Im Folgenden ist die Beziehung zwischen den Dateien beschrieben:
    Abbildung 1. customPassworedEncryption-ProviderdateienAblaufdiagramm, das die Beziehungen zwischen den Dateien und deren Verzeichnissen veranschaulicht.
  6. Optional: Nach Abschluss von Schritt 5 können Sie mit dem folgenden Befehlszeilendienstprogrammbefehl prüfen, ob die Installation erfolgreich war:
    wlp/bin/securityUtility encode --listCustom
    Als Ausgabe werden die Informationen von customPasswordEncryption erwartet, z. B.:
    ö[{"name":"custom","featurename":"usr:customPasswordEncryption-1.0","description":"MyCompany custom password encryption"}]

    Stellen Sie sicher, dass alle erforderlichen Dateien vorhanden sind und dass der Inhalt der Dateien richtig ist.


Symbol das den Typ des Artikels anzeigt. Taskartikel



Symbol für Zeitmarke Letzte Aktualisierung: 01.12.2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twlp_developing_custom_passwd_encrypt
Dateiname: twlp_developing_custom_passwd_encrypt.html