Selbst ausgestellte SAML-HoK-Token mit asymmetrischem Schlüssel über WSS-APIs senden

Sie können selbst ausgestellte SAML-Token mit der Subjektbestätigungsmethode "Holder-of-Key" erstellen und dann das Programmiermodel JAX-WS (Java™ API for XML-Based Web Services) und WSS-APIs (Web Services Security APIs) nutzen, um diese Token über Web-Service-Anforderungsnachrichten zu senden.

Vorbereitende Schritte

Für diese Task müssen Sie mit dem Programmiermodell JAX-WS, den WSS-APIs, mit SAML-Konzepten sowie mit Richtliniensätzen zum Konfigurieren und Verwalten von Web-Service-Einstellungen vertraut sein. Gehen Sie wie folgt vor, bevor Sie mit dieser Task beginnen:
  • Lesen Sie die Informationen zum Senden von selbst ausgestellten SAML-Bearer-Token über WSS-APIs.
  • Lesen Sie die Informationen zum Senden von selbst ausgestellten SAML-Sender-Vouches-Token über WSS-APIs mit Nachrichtenschutz.

Informationen zu diesem Vorgang

Diese Task konzentriert sich auf die Verwendung des asymmetrischen Schlüssels, der von SAML-Sicherheitstoken für die Generierung einer digitalen Signatur ausgewählter SOAP-Nachrichtenelemente angegeben wird, um Sicherheitsanforderungen der Subjektbestätigungsmethode "Holder-of-Key" zu erfüllen. Das Zertifikat X.509 des Senders ist im SAML-Sicherheitstoken eingebettet. Der Sender signiert ausgewählte Abschnitte von Anforderungsnachrichtenelementen, indem er seinen entsprechenden privaten Schlüssel verwendet und die Anforderungsnachricht mit dem öffentlichen Schlüssel des Empfängers verschlüsselt. Der Sender signiert ausgewählte Elemente der Anforderungsnachricht, indem er den privaten Schlüssel des Empfängers verwendet und ausgewählten Elemente der Antwortnachricht mit dem öffentlichen Schlüssel des Senders in SAML-Sicherheitstoken verschlüsselt. Die WS-Security-Richtlinie, die dem Web-Service-Provider zugeordnet ist, wird als Referenz bereitgestellt.

Vorgehensweise

  1. Erstellen Sie ein SAML-Sicherheitstoken, das die Subjektbestätigungsmethode "Holder-of-Key" enthält. Beispiel:
    WSSFactory factory = WSSFactory.getInstance();
    // WSSGenerationContext initialisieren
    com.ibm.websphere.wssecurity.wssapi.WSSGenerationContext gencont = factory.newWSSGenerationContext();
    // Konfiguration des SAML-Ausstellers über angepasste Eigenschaften initialisieren
    HashMap<Object, Object> customProps = new HashMap<Object,Object>();
    customProps.put(SamlConstants.ISSUER_URI_PROP, "example.com");
    customProps.put(SamlConstants.TTL_PROP, "3600000");
    customProps.put(SamlConstants.KS_PATH_PROP, "keystores/saml-provider.jceks");
    customProps.put(SamlConstants.KS_TYPE_PROP, "JCEKS");
    customProps.put(SamlConstants.KS_PW_PROP, "{xor}LCswLTovPiws");
    customProps.put(SamlConstants.KEY_ALIAS_PROP, "samlissuer");
    customProps.put(SamlConstants.KEY_NAME_PROP, "CN=SAMLIssuer, O=EXAMPLE");
    customProps.put(SamlConstants.KEY_PW_PROP, "{xor}NDomLz4sLA==");
    customProps.put(SamlConstants.TS_PATH_PROP, "keystores/saml-provider.jceks");
    customProps.put(SamlConstants.TS_TYPE_PROP, "JCEKS");
    customProps.put(SamlConstants.TS_PW_PROP, "{xor}LCswLTovPiws");  
    gencont.add(customProps); // Angepasste Eigenschaften hinzufügen
    HashMap<Object, Object> map = new HashMap<Object, Object>();
    map.put(SamlConstants.CONFIRMATION_METHOD, "holder-of-key");
    map.put(SamlConstants.Token_REQUEST, "issue");
    map.put(SamlConstants.TOKEN_TYPE, WSSConstants.SAML.SAML20_VALUE_TYPE);
    	map.put(SamlConstants.SAML_NAME_IDENTIFIER, "Alice");
    			map.put(SamlConstants.SIGNATURE_REQUIRED, "true");			
    map.put(SamlConstants.KEY_TYPE, 
            "http://docs.oasis-open.org/ws-sx/ws-trust/200512/PublicKey");
    map.put(SamlConstants.SAML_APPLIES_TO, "http://localhost:9080/your_Web_service");
    map.put(SamlConstants.KEY_ALIAS, "soapinitiator" );
    map.put(SamlConstants.KEY_NAME, "CN=SOAPInitator, O=ACME");
    map.put(SamlConstants.KEY_PASSWORD, "keypass");
    map.put(SamlConstants.KEY_STORE_PATH, "keystores/initiator.jceks");
    map.put(SamlConstants.KEY_STORE_PASSWORD, "storepass");
    map.put(SamlConstants.KEY_STORE_TYPE, "jceks");
    			SAMLGenerateCallbackHandler callbackHandler = new SAMLGenerateCallbackHandler(map);				
    SAMLToken samlToken = (SAMLToken) factory.newSecurityToken(SAMLToken.class,
                          callbackHandler, "system.wss.generate.saml");

    Der private Schlüssel des Senders wird von der Eigenschaft SamlConstants.KEY_ALIAS angegeben und verwendet, um ausgewählte Elemente der Anforderungsnachricht zu signieren.

  2. Verwenden Sie das Objekt WSSGenerationContext, um die Verarbeitung des Sicherheitsheaders der Anforderungsnachricht vorzubereiten. Beispiel:
    gencon.add(samlToken); // diese Codezeile kann übergangen werden
    WSSTimestamp timestamp = factory.newWSSTimestamp();
    gencon.add(timestamp);
    WSSSignature sig = factory.newWSSSignature(samlToken);
    sig.setTokenReference(SecurityToken.REF_KEYID);
    // Wenn die Codezeile "gencon.add(samlToken);" übergangen wird,
    // muss die obige Codezeile durch
    // "sig.setTokenReference(SecurityToken.REF_STR);" ersetzt werden.
    
    sig.setSignatureMethod(WSSSignature.RSA_SHA1);
    sig.setCanonicalizationMethod(WSSSignature.EXC_C14N);
    sig.addSignPart(WSSSignature.BODY);
    sig.addSignPart(WSSSignature.TIMESTAMP);
    sig.addSignPart(WSSSignature.ADDRESSING_HEADERS);
    gencon.add(sig);
    X509GenerateCallbackHandler x509callbackHandler2 = new X509GenerateCallbackHandler(
            null, 
            "keystores/initiator.jceks", 
            "jceks", 
            "storepass".toCharArray(), 
            "soaprecipient",
            null, 
            "", null);
    SecurityToken st2 = factory.newSecurityToken(X509Token.class, x509callbackHandler2);
    WSSEncryption enc = factory.newWSSEncryption(st2);    
    enc.addEncryptPart(WSSEncryption.BODY_CONTENT);
    enc.addEncryptPart(WSSEncryption.SIGNATURE);
    enc.setEncryptionMethod(WSSEncryption.AES256);
    enc.setKeyEncryptionMethod(WSSEncryption.KW_RSA_OAEP);
    gencon.add(enc);

    In diesem Beispiel verwendet die Verschlüsselung eine Schlüsselgröße von 256 Bit, Sie müssen also die JCE-Richtliniendatei Java Cryptography Extension) importieren. Weitere Informationen hierzu finden Sie im Abschnitt "Nicht eingeschränkte JCE-Richtliniendateien verwenden" im Artikel "Web-Services-Security-Anwendungen optimieren".

  3. Erstellen Sie das Objekt WSSConsumingContext, um die Verarbeitung des Sicherheitsheaders der Antwortnachricht vorzubereiten. Beispiel:
    WSSConsumingContext concont = factory.newWSSConsumingContext();
    
    HashMap<Object, Object> map = new HashMap<Object, Object>();
    
    SAMLConsumerCallbackHandler callbackHandler = new SAMLConsumerCallbackHandler(map); 
    WSSDecryption dec = factory.newWSSDecryption(SAMLToken.class, callbackHandler,
                                "system.wss.consume.saml");
    dec.addAllowedEncryptionMethod(WSSDecryption.AES256);
    dec.addAllowedKeyEncryptionMethod(WSSDecryption.KW_RSA_OAEP);
    dec.encryptKey(false);
    dec.addRequiredDecryptPart(WSSDecryption.BODY_CONTENT);
    concont.add(dec);
    X509ConsumeCallbackHandler verHandler = new X509ConsumeCallbackHandler(null, 
                "keystores/initiator.jceks",
                "jceks", 
                "storepass".toCharArray(), 
                "soaprecipient",
                null, null);
    WSSVerification ver = factory.newWSSVerification(X509Token.class, verHandler);
    	    ver.addRequiredVerifyPart(WSSVerification.BODY);
    concont.add(ver);
  4. Verwenden Sie das JDK-Dienstprogramm keytool, um die Dateien saml-provider.jceks, initiator.jceks und recipient.jceks, die zum Testen des Beispielcodes verwendet werden, zu generieren. Beispiel:
    keytool -genkey -alias samlissuer -keystore saml-provider.jceks -dname "CN=SAMLIssuer, O=ACME" -storepass myissuerstorepass -keypass myissuerkeypass
     -storetype jceks -validity 5000 -keyalg RSA -keysize 2048
    
    keytool -genkey -alias soaprecipient -keystore recipient.jceks -dname "CN=SOAPRecipient, O=ACME" -storepass myreciptstorepass -keypass myreciptkeypass
     -storetype jceks -validity 5000 -keyalg RSA -keysize 2048
    
    keytool -genkey -alias soapinitiator -keystore initiator.jceks -dname "CN=SOAPInitator, O=ACME" -storepass myinitatstorepass -keypass myinitatkeypass
     -storetype jceks -validity 5000 -keyalg RSA -keysize 2048
    
    keytool -export -alias samlissuer -file issuerpub.cer -keystore saml-provider.jceks -storepass myissuerstorepass -storetype jceks
    keytool -export -alias soaprecipient -file reciptpub.cer -keystore recipient.jceks -storepass myreciptstorepass -storetype jceks
    keytool -export -alias soapinitiator -file initatpub.cer -keystore initiator.jceks -storepass myinitatstorepass -storetype jceks
    
    keytool -import -alias samlissuer -file issuerpub.cer -keystore initiator.jceks -storepass myissuerstorepass -storetype jceks -keypass myissuerkeypass -noprompt
    keytool -import -alias soaprecipient -file reciptpub.cer -keystore initiator.jceks -storepass myreciptstorepass -storetype jceks -keypass myreciptkeypass -noprompt
    
    keytool -import -alias samlissuer -file issuerpub.cer -keystore recipient.jceks -storepass myreciptstorepass -storetype jceks -keypass myreciptkeypass -noprompt
    keytool -import -alias soapinitiator -file initatpub.cer -keystore initiator.jceks -storepass myinitatstorepass -storetype jceks -keypass myinitatkeypass -noprompt
    
    keytool -import -alias soapinitiator -file initatpub.cer -keystore saml-provider.jceks -storepass myissuerstorepass -storetype jceks -keypass myissuerkeypass -noprompt

Ergebnisse

Sie haben sich mit wichtigen Bausteinen vertraut gemacht, die Sie benötigen, um eine Web-Service-Clientanwendung zu erstellen mit dem Ziel, ein SAML-Sicherheitstoken in einer SOAP-Nachricht zu senden. Außerdem haben Sie gelernt, wie Sie den in der SAML-Sicherheitseinrichtung eingebetteten asymmetrischen Schlüssel verwenden, um Nachrichtenschutz zu gewährleisten.

Beispiel

Das folgende Beispiel veranschaulicht die WS-Security-Richtlinie des Web-Service-Providers:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<wsp:Policy xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
  	xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
  xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200512" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing"
  xmlns:spe="http://www.ibm.com/xmlns/prod/websphere/200605/ws-securitypolicy-ext">
    <wsp:Policy wsu:Id="response:app_encparts">
        <sp:EncryptedElements>
            <sp:XPath>/*[namespace-uri()='http://schemas.xmlsoap.org/soap/envelope/'
             and local-name()='Envelope']/*[namespace-uri()='http://schemas.xmlsoap.org/soap/envelope/' 
             and local-name()='Header']/*[namespace-uri()='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd' 
             and local-name()='Security']/*[namespace-uri()='http://www.w3.org/2000/09/xmldsig#' and local-name()='Signature']</sp:XPath>
            <sp:XPath>/*[namespace-uri()='http://www.w3.org/2003/05/soap-envelope'
             and local-name()='Envelope']/*[namespace-uri()='http://www.w3.org/2003/05/soap-envelope' 
             and local-name()='Header']/*[namespace-uri()='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd' 
             and local-name()='Security']/*[namespace-uri()='http://www.w3.org/2000/09/xmldsig#' and local-name()='Signature']</sp:XPath>
        </sp:EncryptedElements>
        <sp:EncryptedParts>
            <sp:Body/>
        </sp:EncryptedParts>
    </wsp:Policy>
    <wsp:Policy wsu:Id="request:req_enc">
        <sp:EncryptedParts>
            <sp:Body/>
        </sp:EncryptedParts>
    </wsp:Policy>
    <wsp:Policy wsu:Id="request:app_signparts">
        <sp:SignedParts>
            <sp:Body/>
            <sp:Header Namespace="http://schemas.xmlsoap.org/ws/2004/08/addressing"/>
            <sp:Header Namespace="http://www.w3.org/2005/08/addressing"/>
        </sp:SignedParts>
        <sp:SignedElements>
            <sp:XPath>/*[namespace-uri()='http://schemas.xmlsoap.org/soap/envelope/'
             and local-name()='Envelope']/*[namespace-uri()='http://schemas.xmlsoap.org/soap/envelope/' 
             and local-name()='Header']/*[namespace-uri()='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd' 
             and local-name()='Security']/*[namespace-uri()='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd'
             and local-name()='Timestamp']</sp:XPath>
            <sp:XPath>/*[namespace-uri()='http://www.w3.org/2003/05/soap-envelope'
            and local-name()='Envelope']/*[namespace-uri()='http://www.w3.org/2003/05/soap-envelope' 
            and local-name()='Header']/*[namespace-uri()='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd' 
            and local-name()='Security']/*[namespace-uri()='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd'
            and local-name()='Timestamp']</sp:XPath>
        </sp:SignedElements>
    </wsp:Policy>
    <wsp:Policy wsu:Id="response:resp_sig">
        <sp:SignedParts>
            <sp:Body/>
        </sp:SignedParts>
    </wsp:Policy>
    <sp:AsymmetricBinding>
        <wsp:Policy>
            <sp:InitiatorToken>
                <wsp:Policy>
                    <spe:CustomToken sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200512/IncludeToken/Always"/>
                        <wsp:Policy>
                            <spe:WssCustomToken localname="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV2.0"/>
                        </wsp:Policy>
                    </spe:CustomToken>
                </wsp:Policy>
            </sp:InitiatorToken>
            <sp:AlgorithmSuite>
                <wsp:Policy>
                    <sp:Basic256/>
                </wsp:Policy>
            </sp:AlgorithmSuite>
            <sp:IncludeTimestamp/>
            <sp:RecipientToken>
                <wsp:Policy>
                    <sp:X509Token sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200512/IncludeToken/Always"/>
                        <wsp:Policy>
                            <sp:WssX509V3Token11/>
                        </wsp:Policy>
                    </sp:X509Token>
                <wsp:Policy>
            <sp:RecipientToken>
            <sp:Layout>
                <wsp:Policy>
                    <sp:Strict/>
                </wsp:Policy>
            </sp:Layout>
        <wsp:Policy>
    <sp:AsymmetricBinding>
</wsp:Policy>

Symbol, das den Typ des Artikels anzeigt. Taskartikel



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