静的JAX-WSプロキシ・クライアント
Oracle JDeveloperでは、Webサービスを呼び出す静的JAX-WSプロキシ・クライアントを生成するためのデザインタイム・サポートを提供しています。 JDeveloperで、アプリケーションとプロジェクトを作成した後、「新規ギャラリ」ページで「ビジネス層」→「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プロトコルがデフォルトで有効になっています。 メッセージ保護ポリシーを使用するため、クライアントは公開キー証明書をサーバーからインポートします。
-
クライアントの署名証明書が認証局(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");