Vous pouvez utiliser les interfaces SPI GenericSecurityTokenFactory pour créer des jetons X.509 utilisables par l'environnement d'exécution WS-Security. Ces jetons X.509 peuvent être utilisés pour les WSSAPI et les modules de connexion JAAS, mais ils ne s'y limitent pas.
Pourquoi et quand exécuter cette tâche
Lorsque vous utilisez une interface SPI GenericSecurityTokenFactory pour créer un jeton X.509 qui ne contient pas de code XML, le jeton peut être uniquement émis par le générateur X.509 et consommé par le consommateur X.509. Par conséquent, un jeton X.509 est considéré comme jeton simple qui ne doit être utilisé que par son générateur ou consommateur de jeton. Un jeton
X.509 ne peut pas être émis par GenericSecurityTokenLoginModule.
GenericSecurityTokenFactory fournit plusieurs SPI pour créer des jetons X.509 pouvant être émis avec le module de connexion X509GenerateLoginModule ou consommé par le module de connexion X509ConsumeLoginModule. Les jetons X.509 créés avec une SPI GenericSecurityTokenFactory contiennent des clés publiques et/ou privées pouvant être utilisées pour signer ou chiffrer un message sortant ou déchiffrer ou vérifier la signature d'un message sortant.
Vous pouvez utiliser ce type de jeton :
- Si vous devez changer dynamiquement la clé de signature d'un message.
Par exemple, X509GenerateCallbackHandler impose de coder en dur la clé lors de la configuration. Si vous devez remplacer cette valeur codée en dur, vous pouvez coder un module de connexion JAAS empilé sur le module X509GenerateLoginModule pour que le module de connexion place un simple jeton X.509 dans l'état partagé. Le module de connexion X509GenerateLoginModule utilise ensuite la clé privée définie dans le jeton X.509 simple pour remplacer celle configurée dans le gestionnaire de rappel.
- Si vous devez autoriser plusieurs certificats de vérification de signature qui n'apparaissent pas dans le message SOAP. Ces messages incluent des certificats référencés par des attributs, tels que KEYID et X509IssuerSerial.
Le moteur WS-Security ne résout pas dynamiquement les certificats qui n'apparaissent pas dans le message SOAP. Le certificat doit être codé en dur dans le gestionnaire X509ConsumeCallbackHandler et vous ne pouvez configurer qu'un seul certificat dans le gestionnaire de rappel. Si vous décidez d'implémenter le code qui résout le certificat vous-même, vous pouvez placer le code dans un module de connexion JAAS empilé sur le module X509ConsumeLoginModule, puis placer un jeton
X.509 simple dans un état partagé qui contient le certificat public désiré. Le module X509ConsumeLoginModule utilise ensuite le certificat public défini dans le jeton X.509 pour remplacer celui configuré dans le gestionnaire de rappel.
Après la création d'un jeton X.509, la clé publique et la clé privée dans le jeton ne sont pas modifiées. Par conséquent, vous pouvez déterminer le type de jeton à créer, puis exécuter des commandes similaires à celles définies dans les étapes suivantes
pour créer le jeton et le module de connexion JAAS.
- Créez un jeton X.509 simple.
Déterminez le type de jeton simple X.509 à créer et exécutez des commandes similaires à l'une des commandes suivantes.
- Créez un jeton simple X.509 avec un certificat public.
import com.ibm.websphere.wssecurity.wssapi.token.GenericSecurityTokenFactory;
import com.ibm.websphere.wssecurity.wssapi.token.X509Token;
import java.security.cert.X509Certificate;
...
X509Certificate publicCert = null;
GenericSecurityTokenFactory factory = GenericSecurityTokenFactory.getInstance();
//implémenter le code pour obtenir le certificat public
X509Token x509 = factory.getSimpleX509PublicToken(publicCert);
- Créez un jeton simple X.509 avec une clé privée et une clé publique facultative.
import com.ibm.websphere.wssecurity.wssapi.token.GenericSecurityTokenFactory;
import com.ibm.websphere.wssecurity.wssapi.token.X509Token;
import java.security.Key;
import java.security.cert.X509Certificate;
...
Key privateKey = null;
X509Certificate publicCert = null;
GenericSecurityTokenFactory factory = GenericSecurityTokenFactory.getInstance();
//implémenter le code pour obtenir la clé privée
//implémenter éventuellement le code pour obtenir le certificat public
X509Token x509 = null;
try {
x509 = factory.getSimpleX509PrivateToken(publicCert , privateKey);
} catch (WSSException ex) {
//génère une exception si privateKey est null
}
- Créez un module de connexion JAAS pouvant être empilé sur le module
X509GenerateLoginModule ou X509ConsumeLoginModule.
package test.tokens;
import com.ibm.websphere.wssecurity.wssapi.token.GenericSecurityTokenFactory;
import com.ibm.websphere.wssecurity.wssapi.WSSUtilFactory;
import java.util.Map;
import javax.security.auth.Subject;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.login.LoginException;
import javax.security.auth.spi.LoginModule;
import com.ibm.websphere.wssecurity.wssapi.token.X509Token;
import java.security.KeyStore;
import java.security.cert.X509Certificate;
public class MyX509LoginModule implements LoginModule {
//A des fins de lisibilité, ce module de connexion ne fournit aucune
//protection contre les NPE
private Map _sharedState;
private Map _options;
private CallbackHandler _handler;
public void initialize(Subject subject, CallbackHandler callbackHandler,
Map<String, ?> sharedState, Map<String, ?> options) {
this._handler = callbackHandler;
this._sharedState = sharedState;
this._options = options;
}
public boolean login() throws LoginException {
GenericSecurityTokenFactory factory = null;
WSSUtilFactory utilFactory = null;
try {
factory = GenericSecurityTokenFactory.getInstance();
utilFactory = WSSUtilFactory.getInstance();
} catch (Exception e) {
throw new LoginException(e.toString());
}
X509Token x509 = null;
try {
x509 = getX509Token(factory, utilFactory);
} catch (Exception e) {
throw new LoginException("Exception: "+e.toString());
}
//if generating (signing/encrypting):
factory.putGeneratorTokenToSharedState(this._sharedState, x509);
//if consuming (decrypting/signature verification):
factory.putConsumerTokenToSharedState(this._sharedState, x509);
return true;
}
public X509Token getX509Token (GenericSecurityTokenFactory factory,
WSSUtilFactory utilFactory) throws Exception{
//Cet exemple utilise un exemple de chaîne
finale de fichier de clé KEYSTORE = "c:/WebSphere/AppServer/profiles/AppSrv01/etc/ws-security/samples/dsig-sender.ks";
final String KEYSTORE_PASS = "client";
final String ALIAS = "soaprequester";
final String ALIAS_PASS = "client";
final String KEYSTORE_TYPE = "jks";
X509Certificate publicKey = null;
java.security.Key privateKey = null;
java.security.cert.Certificate cert = null;
X509Token x509 = null;
//Si vous devez obtenir un jeton entrant pour traiter un élément
//pour déterminer le certificat à obtenir, obtenez l'élément OMElement du jeton entrant
Map wssContext = utilFactory.GetWSSContext(this._handler);
org.apache.axiom.om.OMElement element = utilFactory.getProcessingElement(wssContext);
//Open the keystore
java.security.KeyStore keystore = utilFactory.getKeyStore(KEYSTORE_TYPE, KEYSTORE, KEYSTORE_PASS.toCharArray());
//Obtenir l'entrée du fichier de clés
KeyStore.PasswordProtection pwdProtection = null;
if (ALIAS_PASS != null) {
pwdProtection = new KeyStore.PasswordProtection(ALIAS_PASS.toCharArray());
}
KeyStore.Entry entry = keystore.getEntry(ALIAS, pwdProtection);
//Obtenir la clé publique et/ou la clé privée depuis l'entrée
if (entry instanceof KeyStore.PrivateKeyEntry) {
//entry is a private key
KeyStore.PrivateKeyEntry pkentry = (KeyStore.PrivateKeyEntry)entry;
cert = pkentry.getCertificate();
privateKey = pkentry.getPrivateKey();
} else if (entry instanceof KeyStore.TrustedCertificateEntry) {
//L'entrée est une clé publique
KeyStore.TrustedCertificateEntry tcentry = (KeyStore.TrustedCertificateEntry)entry;
cert = tcentry.getTrustedCertificate();
}
if ((cert != null) && (cert instanceof X509Certificate)) {
publicKey = (X509Certificate)cert;
} else {
throw new LoginException("Certificate is not X509Certificate");
}
x509 = factory.getSimpleX509Token(publicKey, privateKey);
if (x509 == null) {
throw new LoginException("X509Token is null");
}
return x509;
}
}
- Créez une configuration de connexion JAAS.
Remarque : Cette étape suppose que vous empilez le module JAAS sur X509GenerateLoginModule pour générer un jeton. Si vous souhaitez empiler le module JAAS sur X509ConsumeLoginModule pour consommer un jeton, vous devez ajuster les étapes en conséquence.
- Dans la console d'administration, accédez à .
- Sous Authentification, accédez à .
- Cliquez sur Nouveau et, sous Alias, entrez test.generate.x509.
- Sous Modules de connexion JAAS, cliquez sur Nouveau et, sous Nom de la classe du module, entrez test.tokens.MyX509LoginModule.
Sélectionnez Utiliser le proxy de module de connexion et cliquez sur OK.
- Cliquez sur Nouveau et, sous Nom de la classe du module, entrez com.ibm.ws.wssecurity.wssapi.token.impl.X509GenerateLoginModule.
Cliquez sur
OK.
- Cliquez sur JAAS - Connexions de système dans les éléments de navigation pour revenir à la page de connexions système JAAS.
- Configurez votre générateur de jetons X.509 pour qu'il utilise la nouvelle configuration JAAS.
Remarque : Cette étape suppose que vous empilez le module JAAS sur X509GenerateLoginModule pour générer un jeton. Si vous souhaitez empiler le module JAAS sur X509ConsumeLoginModule pour consommer un jeton, vous devez ajuster les étapes en conséquence.
- Dans la console d'administration, ouvrez la configuration de liaisons à modifier.
- Sélectionnez .
- Sous Jetons d'authentification, sélectionnez le jeton X.509 sortant à modifier.
- Sous Connexion JAAS, sélectionnez test.generate.x509.
- Cliquez sur OK, puis sur Sauvegarder.
- Redémarrez le serveur d'applications pour appliquer les modifications à la configuration JAAS.
- Testez le service.