WSS API を使用した、自己発行 SAML holder-of-key トークン (対称鍵による) の送信

holder-of-key サブジェクト確認メソッドを含む自己発行 SAML トークンを作成し、 Java™ API for XML-Based Web Services (JAX-WS) プログラミング・モデルおよび Web Services Security API (WSS API) を使用して、Web サービス要求メッセージによりこれらのトークンを送信することができます。

始める前に

この作業では、JAX-WS プログラミング・モデル、WSS API インターフェース、SAML の概念、および Web サービスの設定を構成および管理するためのポリシー・セットの使用について、ユーザーが十分な知識を持っていることが前提になります。このタスクを開始する前に、以下のアクションを実行します。
  • WSS API を使用した自己発行 SAML bearer トークンの送信についての資料を参照してください。
  • メッセージ・レベル保護とともに WSS API を使用した自己発行 SAML sender-vouches トークンの送信についての資料を参照してください。

このタスクについて

ここで取り上げるタスクでは、holder-of-key サブジェクト確認方式のセキュリティー要件を満たすために、SAML セキュリティー・トークンに組み込まれている対称鍵を使用して、選択した SOAP メッセージ・エレメントのデジタル署名を生成する方法に焦点を当てています。 Web サービス・プロバイダーに関連付けられた Web Services Security ポリシーは、SAML20 HoK Symmetric WSSecurity default ポリシー・セットのポリシーで、このポリシー・セットは WebSphere® Application Server 7.0.0.7 以降のリリースに同梱されています。

手順

  1. holder-of-key サブジェクト確認方式を使用した SAML セキュリティー・トークンを作成します。 例えば、以下のようにします。
    WSSFactory factory = WSSFactory.getInstance();
    // Initialize WSSGenerationContext
    com.ibm.websphere.wssecurity.wssapi.WSSGenerationContext gencont = factory.newWSSGenerationContext();
    // Initialize SAML issuer configuration via custom properties	
    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); //Add custom properties
    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.SERVICE_ALIAS, "soaprecipient");
    map.put(SamlConstants.KEY_TYPE, 
            "http://docs.oasis-open.org/ws-sx/ws-trust/200512/SymmetricKey");
    map.put(SamlConstants.SAML_APPLIES_TO, "http://localhost:9080/your_Web_service");
    map.put(RequesterConfiguration.RSTT.ENCRYPTIONALGORITHM,
            "http://www.w3.org/2001/04/xmlenc#aes256-cbc");
    map.put(SamlConstants.KEY_SIZE, "256");
    			SAMLGenerateCallbackHandler callbackHandler = new SAMLGenerateCallbackHandler(map);				            
    SAMLToken samlToken = (SAMLToken) factory.newSecurityToken(SAMLToken.class,
            callbackHandler, "system.wss.generate.saml");

    SAML セキュリティー・トークンに組みこまれた証明鍵は、ターゲットの Web サービス用に暗号化されます。 証明鍵を暗号化するターゲット・サービスの公開鍵は、SamlConstants.SERVICE_ALIAS プロパティーによって指定されます。 このプロパティーは、トラスト・ファイル内の公開証明書も指定します。 トラスト・ファイルの場所は com.ibm.websphere.wssecurity.wssapi.WSSGenerationContext カスタム・プロパティーによって指定されます。 この例の場合、暗号化に 256 ビットの鍵サイズが使用されているので、Java Cryptography Extension (JCE) ポリシー・ファイルをインポートする必要があります。 詳しくは、『Web Services Security アプリケーションの調整』のトピックで、無制限 JCE ポリシー・ファイルの使用に関する説明を参照してください。

    デジタル署名や暗号化に対称鍵を直接使用するのではなく、派生鍵を使用する場合には、以下の名前と値のペアを追加してください。

    map.put(SamlConstants.REQUIRE_DKT, "true");
  2. WSSGenerationContext オブジェクトを使用することによって、要求メッセージのセキュリティー・ヘッダーの処理のための準備をします。例:
    gencon.add(samlToken); //this line of code can be omitted
    
    WSSTimestamp timestamp = factory.newWSSTimestamp();
    gencon.add(timestamp);
    
    WSSSignature sig = factory.newWSSSignature(samlToken);
    
    sig.setSignatureMethod(WSSSignature.HMAC_SHA1);
    sig.setCanonicalizationMethod(WSSSignature.EXC_C14N);
    sig.addSignPart(WSSSignature.BODY);
    sig.addSignPart(WSSSignature.TIMESTAMP);
    sig.addSignPart(WSSSignature.ADDRESSING_HEADERS);
    sig.setTokenReference(SecurityToken.REF_KEYID);
    //If the gencon.add(samlToken); line of code is omitted, or DerivedKey is used
    //the above line of code must be replaced with
    //sig.setTokenReference(SecurityToken.REF_STR);
    
    gencon.add(sig);
    
    WSSEncryption enc = factory.newWSSEncryption(samlToken); 
    
    enc.setEncryptionMethod(WSSEncryption.AES256);
    enc.setTokenReference(SecurityToken.REF_KEYID);
    //If the gencon.add(samlToken); line of code is omitted, or DerivedKey is used
    //the above line of code must be replaced with
    //enc.setTokenReference(SecurityToken.REF_STR);
    enc.encryptKey(false);
    enc.addEncryptPart(WSSEncryption.BODY_CONTENT);
    enc.addEncryptPart(WSSEncryption.SIGNATURE);
    gencon.add(enc);
  3. 応答メッセージのセキュリティー・ヘッダーの処理の準備のため、WSSConsumingContext オブジェクトを作成します。例:
    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.encryptKey(false);
    dec.addRequiredDecryptPart(WSSDecryption.BODY_CONTENT);
    
    concont.add(dec);
    
    callbackHandler = new SAMLConsumerCallbackHandler(map);
    WSSVerification ver = factory.newWSSVerification(SAMLToken.class, callbackHandler,
            "system.wss.consume.saml");
    ver.addAllowedSignatureMethod(WSSVerification.HMAC_SHA1);
    	    ver.addRequiredVerifyPart(WSSVerification.BODY);
    ver.addRequiredVerifyPart(WSSVerification.TIMESTAMP);
    
    concont.add(ver);
  4. JDK keytool ユーティリティーを使用して、コード例をテストするための saml-provider.jceks ファイルと recipient.jceks ファイルを生成します。 例えば、次のようにします。
    keytool -genkey -alias samlissuer -keystore saml-provider.jceks -dname "CN=SAMLIssuer, O=ACME" -storepass issuerstorepass
     -keypass issuerkeypass -storetype jceks -validity 5000 -keyalg RSA -keysize 2048
    
    keytool -genkey -alias soaprecipient -keystore recipient.jceks -dname "CN=SOAPRecipient, O=ACME" -storepass reciptstorepass -keypass reciptkeypass -storetype jceks -validity 5000 -keyalg RSA -keysize 2048
    
    keytool -export -alias soaprecipient -file reciptpub.cer -keystore recipient.jceks -storepass reciptstorepass -storetype jceks
    
    keytool -import -alias soaprecipient -file reciptpub.cer -keystore saml-provider.jceks -storepass issuerstorepass -storetype jceks -keypass issuerkeypass -noprompt

タスクの結果

これで、Web サービス・クライアント・アプリケーション作成のための主なビルディング・ブロックについて学習しました。 それは、SOAP メッセージの中で SAML セキュリティー・トークンを送信し、メッセージ・レベル保護で SAML セキュリティーに埋め込まれる対称鍵を使用することを目的としたものでした。


トピックのタイプを示すアイコン タスク・トピック



タイム・スタンプ・アイコン 最終更新: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twbs_configsamlhok_symmetric_usingwssapi
ファイル名:twbs_configsamlhok_symmetric_usingwssapi.html