機械翻訳について

静的JAX-WSプロキシ・クライアント

Oracle JDeveloperでは、Webサービスを呼び出す静的JAX-WSプロキシ・クライアントを生成するためのデザインタイム・サポートを提供しています。 JDeveloperで、アプリケーションとプロジェクトを作成した後、「新規ギャラリ」ページで「ビジネス層」「Webサービス」を選択して、新しい「Webサービス・プロキシ」を作成できます。 プロキシを作成すると、クライアント側のプロキシ・クラスが生成されます。 その後、必要なサービスを呼び出すためのクライアント側のコードを作成できます。

詳細は、Webサービス・プロキシの作成を参照してください。
public class SvcInvoker {
    @WebServiceRef
    private static ExpenseService_Service expenseService_Service;
	

    public static void main(String[] args) throws ServiceException, Exception {
        expenseService_Service = new ExpenseService_Service();
        SecurityPolicyFeature[] features =
            new SecurityPolicyFeature[] { new SecurityPolicyFeature("policy:oracle/wss_username_token_over_ssl_client_policy") }; 
			//or any other policy, as required 
        ExpenseService expenseService =
            expenseService_Service.getExpenseServiceSoapHttpPort(features);
        ……//security setting code goes here
        //invoke the service
        FindCriteria fc = new FindCriteria();
        fc.setFetchSize(1);
        List<Expense> exps = expenseService.findExpense(fc, null);
        if (exps != null && !exps.isEmpty()) {
            Expense exp = exps.get(0);
            //access the expenses
        } else
            System.out.println("No expenses");
    }
}

クライアント側のセキュリティ・ポリシー

サービスを呼び出すために使用されるクライアント側のセキュリティ・ポリシーに基づいて、セキュリティ設定を構成する必要があります。
  • トランスポート層のセキュリティ・ポリシー:

    • oracle/wss_username_token_over_ssl_client_policy

    • oracle/wss_http_token_over_ssl_client_policy

    • oracle/wss_saml_token_bearer_over_ssl_client_policy

  • メッセージ保護ポリシー:

    • oracle/wss11_username_token_with_message_protection_client_policy

    • oracle/wss11_saml_token_with_message_protection_client_policy

トランスポート層のセキュリティ・ポリシーの場合、クライアントはサーバー上のSSL (Secure Socket Layer)プロトコルを使用してWebサービスを呼び出します。 Oracle Applications Cloudでは、サーバー上でSSLプロトコルがデフォルトで有効になっています。 メッセージ保護ポリシーを使用するため、クライアントは公開キー証明書をサーバーからインポートします。

サービスを呼び出すためのユーザー・アイデンティティがクライアント側で保持される場合、SAMLトークン・ポリシーよりもユーザー名トークン・ポリシーを使用するほうが簡単です。 SAMLトークン・ポリシーではアイデンティティの伝播がサポートされていますが、次のすべてのことが該当する場合を除き、サーバーとクライアントの間での証明書の交換が必要です。
  • クライアントの署名証明書が認証局(CA)から発行されています。

  • CA証明書がサーバーのトラスト・ストアに格納されています。

  • SAMLアサーションが署名証明書を保持しています。

クライアントがJava Cloud Serviceにデプロイされている場合など、クライアント側がOracle Applications Cloud上にあり、対応するOracle Applications Cloudインスタンスにリンクされているときには、証明書の交換がすでに構成されています。 クライアントの性質と各ポリシーの要件に基づいて、使用するクライアント側ポリシーを決定する必要があります。

セキュリティ構成

個々のクライアント側のセキュリティ・ポリシーに必要なセキュリティ構成は、次のとおりです。

oracle/wss_username_token_over_ssl_client_policy

このポリシーでは、サービス・エンドポイントURLはHTTPSプロトコルを使用する必要があり、構成は必要ありません。 静的プロキシのクライアント側コードは、ユーザー名とパスワードを指定します。

WSBindingProvider wsbp = (WSBindingProvider)expenseService;
Map<String, Object> requestContext = wsbp.getRequestContext();

requestContext.put(com.sun.xml.ws.developer.WSBindingProvider.USERNAME_PROPERTY,
"user");

requestContext.put(com.sun.xml.ws.developer.WSBindingProvider.PASSWORD_PROPERTY, "password");

これは最も単純な方法ですが、推奨される方法は、資格証明ストアにユーザー名とパスワードを格納し、csf-keyを使用して資格証明ストアのエントリを参照することです。 Webサービス・プロキシを生成するときは、Oracle JDeveloperを使用して資格証明ストアを作成します。 また、「プロパティのオーバーライド」「新規キー」を選択して、プロキシ・オブジェクトを生成した後でプロパティを編集することもできます。

  • cwallet.ssoファイル: 資格証明ストア。

  • jps-config.xmlファイル: プログラムのセキュリティ・コンテキスト。 cwallet.sso資格証明ストアを指すエントリを格納します。

クライアント側のコードで、jps-config.xmlファイルの場所とcsf-keyの値を指定する必要があります。

System.setProperty("oracle.security.jps.config", "path_to_jps-config.xml");
expenseService_Service = new ExpenseService_Service();
SecurityPolicyFeature[] features = new SecurityPolicyFeature[] {
	new SecurityPolicyFeature("policy: oracle/wss_username_token_over_ssl_client_policy " };
ExpenseService expenseService =
	expenseService_Service.getExpenseServiceSoapHttpPort(features);
WSBindingProvider wsbp = (WSBindingProvider)expenseService;
Map<String, Object> requestContext = wsbp.getRequestContext();
requestContext.put(SecurityConstants.ClientConstants.WSS_CSF_KEY, "csf-key");

oracle/wss_http_token_over_ssl_client_policy

このポリシーの要件はoracle/wss_username_token_over_ssl_client_policyポリシーと同じです。 このポリシーはHTTPヘッダーの認証情報を設定しますが、oracle/wss_username_token_over_ssl_client_policyポリシーはSOAPヘッダーの認証情報を設定します。

oracle/wss_saml_token_bearer_over_ssl_client_polic

このポリシーはSAMLトークンを使用するため、クライアントの署名キーと暗号化キーを格納するキーストアがクライアントに必要です。 クライアントからサーバーに公開キー証明書をインポートする必要があります。

  • クライアントでのキーストアの生成: JDKで提供されているkeytoolを使用して、セキュリティ証明書を格納するキーストアを生成します。 キーストアの.jksファイルを生成するには:
    keytool -genkeypair -keyalg RSA -alias mycompkey -keypass password -keystore
    mycompclient-keystore.jks -storepass password -validity 3600
  • クライアントからの証明書のエクスポート: 次のkeytoolコマンドを使用して証明書をエクスポートします。
    keytool -exportcert -alias mycompkey -file clientpubkey.cer -keystore mycompclient-keystore.jks -storepass password
  • サーバーへの証明書のインポート: 次のkeytoolコマンドを使用して、クライアントによって生成された証明書を、信頼できる証明書エントリとしてサーバー・キーストアにインポートします。
    keytool -importcert -alias clientkey -file clientpubkey.cer -keystore default-keystore.jks -storepass password
  • クライアントのセキュリティ・コンテキストへのキーストアの追加: プロキシ・クライアント側のコードで、パスワードで保護されたキーストア、署名キーおよび暗号化キーを指定する必要があります。 Oracle JDeveloperを使用して、キーストアをインポートし、パスワードを設定して、クライアント側のセキュリティ・コンテキストでキーストアを設定します。

  • プロキシ・クライアント側のコード: WSSEC_SIG_KEY_ALIASおよびWSSEC_ENC_KEY_ALIASを使用して、クライアント側の署名秘密キーと暗号化秘密キーを指定します。 この秘密キーは、証明書の生成に使用されたものと同じである必要があります。 このコードの要求はSAMLトークンを使用するため、ユーザー名が渡されますが、パスワードは渡されません。 クライアント側のコードでは、セキュリティを次のように構成できます。
    System.setProperty("oracle.security.jps.config", " path_to_jps-config.xml");
    String policy = "oracle/wss_saml_token_bearer_over_ssl_client_policy";
    expenseService_Service = new ExpenseService_Service();
    SecurityPolicyFeature[] features =
    	new SecurityPolicyFeature[] { new SecurityPolicyFeature("policy:" + policy) };
    ExpenseService expenseService =
    	expenseService_Service.getExpenseServiceSoapHttpPort(features);
    	
    WSBindingProvider wsbp = (WSBindingProvider)expenseService;
    Map<String, Object> requestContext = wsbp.getRequestContext();
    //client-side private signing key
    requestContext.put(ClientConstants.WSSEC_SIG_KEY_ALIAS, "mycompkey");
    //client-side private encryption key
    requestContext.put(ClientConstants.WSSEC_ENC_KEY_ALIAS, "mycompkey");
    //location of the keystore file
    requestContext.put(ClientConstants.WSSEC_KEYSTORE_LOCATION,
    	"path_to_ mycompclient-keystore.jks");
    requestContext.put(WSBindingProvider.USERNAME_PROPERTY, "username");

oracle/wss11_username_token_with_message_protection_client_policy

このポリシーを使用すると、Webサービス・コンシューマによって、ユーザー名およびパスワード資格証明が挿入され、送信SOAPメッセージが署名および暗号化されます。 Webサービス・プロバイダによって、メッセージと署名が復号化および検証されます。 このポリシーでは、クライアントにサーバーから公開キーをインポートする必要があります。

  • クライアントでのキーストアの生成: JDKで提供されているkeytoolを使用して、セキュリティ証明書を格納するキーストアを生成します。 キーストアの.jksファイルを生成するには:
    keytool -genkeypair -keyalg RSA -alias mycompkey -keypass password -keystore
    mycompclient-keystore.jks -storepass password -validity 3600
  • 公開キー証明書の生成: クライアントは、サーバーの公開キーを必要とします。 WSDLファイルでは、wsdl:service/wsdl:port/wsa:EndpointReference/wsid:Identity/dsig:keyInfo/dsig:X509Data/dsig:X509Certificate要素に証明書が格納されています。 テキスト・ファイルを作成し、証明書要素を---- BEGIN CERTIFICATE ----文と---- END CERTIFICATE ----文で囲みます。 このテキスト・ファイルをpk.cerとして保存します。
    <wsdl:service name="ExpenseService">
    	<wsdl:port name="ExpenseServiceSoapHttpPort" binding="tns:ExpenseServiceSoapHttp">
    	....
    	<wsa:EndpointReference xmlns:wsa="http://www.w3.org/2005/08/addressing">
    		<wsid:Identity xmlns:wsid="http://schemas.xmlsoap.org/ws/2006/02/addressingidentity">
    			<dsig:KeyInfo xmlns:dsig="http://www.w3.org/2000/09/xmldsig#">
    				<dsig:X509Data>
    <dsig:X509Certificate>MIICHTCCAYagAwIBAgIEUG1GfDANBgkqhkiG9w0BAQUFADBTMR
    MwEQYKCZImiZPyLGQBGRYDY29tMRYwFAYKCZImiZPyLGQBGRYGb3JhY2xlMRIwEA
    YKCZImiZPyLGQBGRYCdXMxEDAOBgNVBAMTB3NlcnZpY2UwHhcNMTIxMDA0MDgx
    OTA4WhcNMTUxMDA0MDgxOTA4WjBTMRMwEQYKCZImiZPyLGQBGRYDY29tMRYw
    FAYKCZImiZPyLGQBGRYGb3JhY2xlMRIwEAYKCZImiZPyLGQBGRYCdXMxEDAOBgN
    VBAMTB3NlcnZpY2UwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMvYgi3PpA9T
    vD6YptxWZDy6nusDfJYrQe5Q3cYjtR54exM8Ju29z2Mtk98HEZXMs2+GqNO7Ms8QZQ2Owl
    nuS0VZNMUQu3MkjM4UKyK+37H32jud3HP5jigpJARgtxfH1Z1RK4VovU1VFPeRULG+7em
    CvdfOks5o6dTPmH1xpsXLAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAguzjcfLzQUH5d
    O4jER9g4xrmjxZrKo8YC2xxGKzpxuMSg3EUhUPOznzZFv09+sIO2UFGpPV5NqNWlvFqej3
    VBSal2HfGUQgMRe+kPV6ysAWvZ4T1pOxj4NDeWRUMjgjt14OXEOxifPbLhvOmiC8dD9d
    FwcdWh7lMMcwz0VM9F0M=</dsig:X509Certificate>
    </dsig:X509Certificate>
    ......
    
  • 証明書をクライアントにインポート: 次のkeytoolコマンドを使用して、証明書をクライアント・キーストアにインポートします。
    keytool -importcert -alias pubkey -file pk.cer -keystore mycompclient-keystore.jks -storepass password
  • クライアントのセキュリティ・コンテキストの構成: プロキシ・クライアント側のコードで、パスワードで保護されたキーストア、署名キーおよび暗号化キーを指定する必要があります。 Oracle JDeveloperを使用して、ユーザー/パスワードを格納するcsf-keyを作成し、キーストアをインポートして、クライアント側のセキュリティ・コンテキストでパスワードとキーストアを設定します。

  • プロキシのクライアント側コード: クライアント側コードでは、次のようにセキュリティを構成できます。
    System.setProperty("oracle.security.jps.config", “ path_to_jps-config.xml");
    String policy = "oracle/wss11_username_token_with_message_protection_client_policy";
    expenseService_Service = new ExpenseService_Service();
    
    SecurityPolicyFeature[] features =
    	new SecurityPolicyFeature[] { new SecurityPolicyFeature("policy:" + policy) };
    ExpenseService expenseService =
    	expenseService_Service.getExpenseServiceSoapHttpPort(features);
    	
    WSBindingProvider wsbp = (WSBindingProvider)expenseService;
    Map<String, Object> requestContext = wsbp.getRequestContext();
    
    //location of the keystore file
    requestContext.put(ClientConstants.WSSEC_KEYSTORE_LOCATION,
    	"path_to_mycomp-keystore.jks");
    	
    requestContext.put(SecurityConstants.ClientConstants.WSS_CSF_KEY, "csf-key");

oracle/wss11_saml_token_with_message_protection_client_policy

このポリシーは、メッセージ保護とSAMLトークンの両方を使用します。 メッセージ保護を構成するには、クライアント側のキーストアにサーバーから公開キー証明書をインポートする必要があります。 SAMLトークンを使用するには、サーバーにクライアントから証明書をインポートする必要があります。

  • クライアントでキーストアを生成: keytoolを使用して、秘密キーおよび公開キーを管理するキーストアを生成します。
    keytool -genkeypair -keyalg RSA -alias mycompkey -keypass password -keystore
    mycompclient-keystore.jks -storepass password -validity 3600
  • サーバー側の公開キー証明書の生成: このポリシーの場合、クライアントは、サーバー側で生成された公開キーを必要とします。 WSDLファイルでは、wsdl:service/wsdl:port/wsa:EndpointReference/wsid:Identity/dsig:keyInfo/dsig:X509Data/dsig:X509Certificate要素に証明書が格納されています。 テキスト・ファイルを作成し、証明書要素を---- BEGIN CERTIFICATE ----文と---- END CERTIFICATE ----文で囲みます。 このテキスト・ファイルをpk.cerとして保存します。

  • クライアントへの証明書のインポート: 次のkeytoolコマンドを使用して、サーバーによって生成された証明書をクライアントのキーストアにインポートします。keytool -importcert -alias pubkey -file pk.cer -keystore mycompclient-keystore.jks -storepass password

  • クライアントからの証明書のエクスポート: 次のkeytoolコマンドを使用して、証明書をエクスポートします。keytool -exportcert -alias mycompkey -file clientpubkey.cer -keystore mycompclient-keystore.jks -storepass password

  • サーバーへのクライアント側証明書のインポート: 次のkeytoolコマンドを使用して、クライアントによって生成された証明書を、信頼できる証明書エントリとしてサーバーのキーストアにインポートします。keytool -importcert -alias clientkey -file clientpubkey.cer -keystore default-keystore.jks -storepass password

  • クライアントのセキュリティ・コンテキストの構成: プロキシ・クライアント側のコードで、パスワードで保護されたキーストア、署名キーおよび暗号化キーを指定する必要があります。 Oracle JDeveloperを使用して、キーストアをインポートし、クライアント側のセキュリティ・コンテキストでパスワードとキーストアを設定します。

  • プロキシ・クライアント側のコード: WSSEC_SIG_KEY_ALIASおよびWSSEC_ENC_KEY_ALIASを使用して、クライアント側の署名秘密キーと暗号化秘密キーを指定します。 この秘密キーは、証明書の生成に使用されたものと同じである必要があります。 このコードの要求はSAMLトークンを使用するため、ユーザー名が渡されますが、パスワードは渡されません。 クライアント側のコードでは、セキュリティを次のように構成できます。
    ノート: このサンプル・コードは、JSE環境のみで機能します。 JEE環境では、通常、現在のユーザーがサーバーに伝播されます。 クライアントとサーバーはアイデンティティ・ストアを共有し、アイデンティティ・フェデレーションを使用する必要があります。または、クライアント側がSecurity Token Service (STS)を使用して、クライアントの資格証明をサーバーの資格証明にマップします。
    System.setProperty("oracle.security.jps.config", "path_to_jps-config.xml");
    String policy = "oracle/wss11_saml_token_with_message_protection_client_policy";
    expenseService_Service = new ExpenseService_Service();
    SecurityPolicyFeature[] features =
    	new SecurityPolicyFeature[] { new SecurityPolicyFeature("policy:" +policy)};
    ExpenseService expenseService =
    	expenseService_Service.getExpenseServiceSoapHttpPort(features);
    	
    WSBindingProvider wsbp = (WSBindingProvider)expenseService;
    Map<String, Object> requestContext = wsbp.getRequestContext();
    
    requestContext.put(ClientConstants.WSSEC_SIG_KEY_ALIAS, "mycompkey");
    requestContext.put(ClientConstants.WSSEC_ENC_KEY_ALIAS, "mycompkey");
    //location of the keystore file
    requestContext.put(ClientConstants.WSSEC_KEYSTORE_LOCATION,
    	“ path_to_mycomp-keystore.jks");
    requestContext.put(WSBindingProvider.USERNAME_PROPERTY, "username");
関連トピック
  • HTTPクライアント
  • 動的ディスパッチ・クライアント
  • Javaクライアント
  • SOAP Webサービスの呼出し