Oracle® Fusion Middleware Oracle WebLogic Server WebLogic Webサービスの保護 12cリリース1(12.1.1) B65929-01 |
|
前 |
次 |
この章ではJava API for XML Web Services(JAX-WS)とJava API for XML-based RPC(JAX-RPC)を使用して、WebLogic Webサービスでトランスポート・レベルのセキュリティを構成する方法について説明します。
トランスポート・レベルのセキュリティとは、Secure Sockets Layer(SSL)を使用して、クライアント・アプリケーションとWebサービスとの間の接続を保護することです。
SSLでは、ネットワーク接続している2つのアプリケーションが互いのアイデンティティを認証できるようにするとともに、アプリケーション間でやりとりされるデータを暗号化することでセキュアな接続が実現します。認証を使用すると、サーバーは(場合によってはクライアントも)ネットワーク接続の相手側アプリケーションのアイデンティティを検証できます。クライアント証明書(双方向SSL)を使用してユーザーを認証できます。
SSLの一般情報とWebLogic Serverに含まれる実装については、『Oracle WebLogic Serverセキュリティの理解』のSecure Sockets Layer (SSL)に関する項を参照してください。
トランスポート・レベルのセキュリティにはSSLだけでなくHTTP基本認証が含まれます。
この章の内容は以下のとおりです。
WebLogic Serverには、「使用可能なトランスポート・レベルのポリシー」で説明しているトランスポート・レベルの事前定義済ポリシー・ファイルが含まれています。これは通常、大半のプログラマとユース・ケースのセキュリティ・ニーズを満たします。
追加の構成が必要な場合は、「カスタム・ポリシー・ファイルの作成と使用」に記載されているように、独自のWS-SecurityPolicyファイルを作成して使用することもできます。これを行う必要がある場合、事前定義済のWS-SecurityPolicyファイルをテンプレートとして使用して独自のカスタム・ファイルを作成できます。.xmlポリシー・ファイルはMW_HOME/WL_HOME
/server/lib/weblogic.jar
に位置しています。weblogic.jar
内で、ポリシー・ファイルは/weblogic/wsee/policy/runtime
に位置しています。
たとえば、Oracle提供のWssp1.2-2007-Saml2.0-Bearer-Https.xml
ポリシー・ファイルには、ポリシーで一方向SSLが必要なことを示す次のアサーションが含まれています(例3-1を参照)。
例3-1 ポリシーでのSSLの指定
<sp:TransportToken> <wsp:Policy> <sp:HttpsToken/> </wsp:Policy> </sp:TransportToken>
かわりに双方向SSLを使用する必要がある場合、例3-2に示されているようにRequireClientCertificate
アサーションを追加するカスタム・ポリシーを作成できます。
例3-2 ポリシーでの双方向SSLの指定
<sp:TransportToken> <wsp:Policy> <sp:HttpsToken > <wsp:Policy> <sp:RequireClientCertificate/> </wsp:Policy> </sp:HttpsToken> </wsp:Policy> </sp:TransportToken>
Wssp1.2-2007-Https-BasicAuth.xml
ポリシー・ファイルでは、例3-3のように、SSLとHTTP基本認証の両方を必要としています。
これらのポリシーでは、WSDLへのアクセスおよびWebサービス操作の呼出しに、https
プロトコルを使用する必要があります。
表3-1 トランスポート・レベルのポリシー
ポリシー・ファイル | 説明 |
---|---|
Wssp1.2-2007-Saml2.0-Bearer-Https.xml |
一方向SSLは、認証のためにBearer確認メソッドを持つSAML 2.0トークンを使用します。 |
Wssp1.2-2007-Saml2.0-Bearer-Https-Basic256Sha256.xml |
Wssp1.2-2007-Saml2.0-Bearer-Https.xmlと同じですが、Sha-256のより強力なハッシュ・アルゴリズムを使用します。 |
Wssp1.2-2007-Saml1.1-Bearer-Https.xml |
一方向SSLは、認証のためにBearer確認メソッドを持つSAML 1.1トークンを使用します。 |
Wssp1.2-2007-Saml1.1-Bearer-Https-Basic256Sha256.xml |
Wssp1.2-2007-Saml1.1-Bearer-Https.xmlと同じですが、Sha-256のより強力なハッシュ・アルゴリズムを使用します。 |
Wssp1.2-2007-Https.xml |
一方向SSL。 |
Wssp1.2-2007-Https-BasicAuth.xml |
基本認証による一方向SSL。リクエストに認可ヘッダーが含まれていない場合は401チャレンジが発生します。 |
Wssp1.2-2007-Https-ClientCertReq.xml |
双方向SSL。受信側で、発信元のパブリック証明書をチェックします。認証にクライアント証明書を使用することも可能です。 相互クライアント証明書の動作を「クライアント証明書をリクエスト(強制しない)」に設定します。設定方法については、Oracle WebLogic Server管理コンソール・ヘルプの双方向SSLの構成に関する項を参照してください。 |
Wssp1.2-2007-Https-UsernameToken-Digest.xml |
ダイジェスト・ユーザー名トークンによる一方向SSL。 |
Wssp1.2-2007-Https-UsernameToken-Plain.xml |
プレーン・テキスト・ユーザー名トークンによる一方向SSL。 |
Wssp1.2-2007-Https-UsernameToken-Plain-Basic256Sha256.xml |
Wssp1.2-2007-Https-UsernameToken-Plain.xmlと同じですが、Sha-256のより強力なハッシュ・アルゴリズムを使用します。 |
Wssp1.2-Https.xml |
一方向SSL。 |
Wssp1.2-Https-BasicAuth.xml |
基本認証による一方向SSL。リクエストに認可ヘッダーが含まれていない場合は401チャレンジが発生します。 |
Wssp1.2-Https-UsernameToken-Digest.xml |
ダイジェスト・ユーザー名トークンによる一方向SSL。 |
Wssp1.2-Https-UsernameToken-Plain.xml |
プレーン・テキスト・ユーザー名トークンによる一方向SSL。 |
Wssp1.2-Https-ClientCertReq.xml |
双方向SSL。受信側で、発信元のパブリック証明書をチェックします。認証にクライアント証明書を使用することも可能です。 |
トランスポート・レベルのポリシーを使用してWebサービスを保護する前に、WebLogic Serverのコア・セキュリティ・サブシステムでSSLを構成する必要があります。
すぐに使用できる秘密鍵とX.509証明書のペアは、デモやテストの目的で提供されています。このため、本番では独自のキーストアおよびキー・ペアを使用することを強くお勧めします。
一方向のSSL (WebLogic Serverがクライアント・アプリケーションに証明書を提示する必要がある)、または双方向のSSL (クライアント・アプリケーションとWebLogic Serverが両方とも互いに証明書を提示する必要がある)のいずれかを構成できます。
WebLogic Serverのコア・セキュリティ・サブシステムに対して双方向または一方向のSSLを構成する場合は、『Oracle WebLogic Serverの保護』のSSLの構成に関する項を参照してください。
WebLogic Serverで双方向SSLを構成する場合、「クライアント・アプリケーションでの双方向SSLの構成」に記載されているように、クライアント・アプリケーションでもSSLを構成する必要があります。
この項では、「SSLの設定: 主な手順」に記載されている手順を簡単にまとめています。これらの手順は参考です。詳細は、「SSLの設定: 主な手順」を参照してください。
SSLを設定するには、次の手順に従います。
アイデンティティと信頼の構成に関する項に記載されているように、アイデンティティと信頼を構成します。
CertGenユーティリティ、keytoolユーティリティ、またはEntrustやVerisignなどの信頼できるベンダーから、デジタル証明書、秘密鍵および信頼性のあるCA証明書を取得します。WebLogic Serverのキットに用意されているデジタル証明書、秘密鍵、および信頼性のあるCA証明書を使用することもできます。デモ用のデジタル証明書、秘密鍵、および信頼性のあるCA証明書は、開発環境でのみ使用してください。
秘密鍵、デジタル証明書、および信頼性のあるCA証明書を格納します。秘密鍵と信頼性のあるCA証明書は、キーストアに格納します。
WebLogic Server管理コンソールで、WebLogic ServerのIDキーストアと信頼キーストアを構成します。Oracle WebLogic Server管理コンソール・ヘルプのキーストアの構成に関する項を参照してください。
WebLogic管理コンソールで、秘密鍵のエリアスとパスワードに関するSSL構成オプションを設定します。
必要な場合、クライアント証明書の提示を必須とする構成オプションを設定します(双方向SSLの場合)。Oracle WebLogic Server管理コンソール・ヘルプの双方向SSLの構成に関する項を参照してください。
注意: 非同期の、または信頼性のあるメッセージングを使用するWebサービスでは、非同期のレスポンスや確認応答を送信する目的で(受信側サービスから送信側サービスに向けて)新しい接続を確立するときに、サーバーのSSL証明書を自動的に使用します。 |
WebLogic Serverで双方向SSLを構成した場合は、一方向SSLで必要とされるようにWebLogic Serverがクライアント・アプリケーションに証明書を提示するだけでなく、クライアント・アプリケーションがWebLogic Serverに証明書を提示する必要があります。さらに、次の要件も満たす必要があります:
クライアントの秘密鍵とX.509証明書のペアが格納されたクライアント側キーストアを作成します。
Java SEのSSLパッケージを使用する場合は、クライアントの秘密鍵のパスワードとクライアントのキーストアのパスワードが同一であることが求められます。そのため、クライアント・キーストアには秘密鍵とX.509証明書のペアを1つしか格納できません。
WebLogic Serverのコア・セキュリティ・サブシステムを構成して、クライアント・キーストア内のクライアントのX.509証明書をユーザーにマップします。『Oracle WebLogic Serverの保護』のユーザー名マッパーの構成に関する項を参照してください。
クライアントが信頼する証明書を格納する信頼ストアを作成します。クライアント・アプリケーションはこの信頼ストアを使用して、WebLogic Serverから受け取った証明書を検証します。前の項目で説明したJava SEのパスワード要件のため、この信頼ストアは、クライアントがサーバーに提示するキー・ペアを格納するキーストアとは異なっている必要があります。
Cert Genユーティリティやkeytoolユーティリティ(http://download.oracle.com/javase/6/docs/technotes/tools/windows/keytool.html
)を使用して、この手順を実行できます。開発が目的の場合は、keytool
ユーティリティを使用すると簡単に開始できます。
『Oracle WebLogic Serverの保護』の秘密鍵、デジタル証明書、および信頼性のある認証局の取得に関する項を参照してください。
相互クライアント証明書の動作を「クライアント証明書をリクエスト(強制しない)」に設定します。設定方法については、Oracle WebLogic Server管理コンソール・ヘルプの双方向SSLの構成に関する項を参照してください。
Webサービスを呼び出すクライアント・アプリケーションを実行するときに、次のプロパティを指定します。
-Djavax.net.ssl.trustStore=trustStore
-Djavax.net.ssl.trustStorePassword=trustStorePassword
trustStoreには、信頼性のある証明書のリスト(必ずサーバーの証明書を1つ含む)を格納するクライアント側の信頼ストアの名前を指定し、trustStorePasswordには、信頼ストアのパスワードを指定します。
上記のプロパティは、クライアント側キーストアを指定するために設定する必要のある標準的なプロパティに追加されるものです。
-Djavax.net.ssl.keyStore=keyStore
-Djavax.net.ssl.keyStorePassword=keyStorePassword
1つまたは複数のポリシー・ファイルを使用してトランスポート・レベルのWebサービス・セキュリティを構成するには:
「前提条件: SSLの構成」に記載されているように、WebLogic Serverコア・セキュリティ・サブシステムに対してSSLを構成します。
一方向のSSL (WebLogic Serverがクライアント・アプリケーションに証明書を提示する必要があります)、または双方向のSSL (クライアント・アプリケーションとWebLogic Serverが両方とも互いに証明書を提示する必要があります)のいずれかを構成できます。
WebLogic Serverのコア・セキュリティ・サブシステムに対して双方向または一方向のSSLを構成する場合は、『Oracle WebLogic Serverの保護』のSSLの構成に関する項を参照してください。
JWSファイルで@Policy
または@Policies
JWSアノテーションを使用するか、管理コンソールを使用して実行時にポリシー・ファイルを関連付けます。あるいは、アノテーションを使用して一部のポリシー・ファイルを指定し、実行時に追加のポリシー・ファイルを関連付けます。
使用可能なトランスポート・レベルのポリシーの詳細は、表3-1を参照してください。
注意: Webサービスにトランスポート・レベルのセキュリティ・ポリシーを指定する場合、ポリシーの指定はクラス・レベルで行う必要があります。また、トランスポート・レベルのセキュリティ・ポリシーは着信方向と発信方向の両方に適用する必要があります。つまり、着信にHTTPSを使用し、発信にHTTPを使用することはできません。 |
次の例では、ポリシーをクラス・レベルでアタッチしています。
@Policy(uri="policy:Wssp1.2-2007-Saml2.0-Bearer-Https.xml") public class EchoService { ....
JWSファイルに@Policy
または@Policies
JWSアノテーションを追加した場合は、通常の反復的開発プロセスの一環として、Webサービスをコンパイルして再デプロイします。
Webサービスを呼び出すクライアント・アプリケーションを実行するときは、アプリケーションで使用するSSL実装を示す特定のプロパティを指定します。特に:
SunのSSL実装を指定するには、次のプロパティを使用します。
-Djavax.net.ssl.trustStore=trustStore
trustStoreには、信頼性のある証明書のリスト(必ずサーバーの証明書を1つ含む)を格納するクライアント側の信頼ストアの名前を指定します。ホスト名検証を無効にするには、次のプロパティも指定します。
-Dweblogic.wsee.client.ssl.stricthostchecking=false
双方向SSLの詳細は、「クライアント・アプリケーションでの双方向SSLの構成」を参照してください。
この項では、スタンドアロンの一方向SSLクライアントからトランスポート・セキュリティを使用したJAX-WSを構成するための単純な例について説明します。
その他の前提条件については、次のドキュメントを参照してください。
『Oracle WebLogic Serverの保護』のSSLの構成に関する項
Oracle WebLogic Server管理コンソール・ヘルプのSSLの構成に関する項
Oracle WebLogic Server管理コンソール・ヘルプのキーストアの構成に関する項
WebサービスのJavaソースを例3-4に示します。
注意: Webサービスにトランスポート・レベルのセキュリティ・ポリシーを指定する場合、ポリシーの指定はクラス・レベルで行う必要があります。また、トランスポート・レベルのセキュリティ・ポリシーは着信方向と発信方向の両方に適用する必要があります。つまり、着信にHTTPSを使用し、発信にHTTPを使用することはできません。 |
例3-4 Webサービスの一方向SSLの例
package httpbasicauth import javax.jws.WebMethod; import javax.jws.WebService; import weblogic.jws.Policy; @WebService(name="HttpsBasicAuth", portName="HttpsBasicAuthSoapPort" targetNamespace="https://httpsbasicauth") // Security Policy for Https and Http Basic Authentication @Policy(uri = "policy:Wssp1.2-2007-Https-BasicAuth.xml) public class HttpsBasicAuth { public HttpsBasicAuth() {} WebMethod() public String echoString(String input) { return("[HttpsBasicAuth.echoString]: " + input); } }
weblogic.netをJavaプロトコル・ハンドラとして使用するスタンドアロンのJava Webサービス・クライアントのコードを例3-5に示します。
例3-5 weblogic.netを使用するWebサービス・クライアントの一方向SSLの例
package httpbasicauth.client import java.net.URL; import java.security.cert.X509Certificate; import java.util.Map; import javax.xml.namespace.QName; import javax.xml.ws.BindingProvider; import httpsbasicauth.client.HttpsBasicAuthService; import httpsbasicauth.client.HttpsBasicAuth; public class HttpsBasicAuthClient private final static String ENDPOINT = .....; private final static String TARGET_NAMESPACE = "https://httpsbasicauth private final static String USERNAME = ....; private final static String PASSWORD = ....; private final static String TRUST_STORE_LOCATION = .....; private final static String TARGET_NAMESPACE = ....; private HttpsBasicAuthService service; private HttpsBasicAuth stub; public HttpsBasicAuthClient() { try { // This ignores the host name verifcation for the Public Certificate used by the Server System.setProperty("weblogic.security.SSL.ignoreHostnameVerification","true"); System.setProperty("java.protocol.handler.pkgs", "weblogic.net"); System.setProperty("weblogic.security.TrustKeyStore","CustomTrust"); System.setProperty("weblogic.security.CustomTrustKeyStoreFileName", "TRUST_STORE_LOCATION"); System.setProperty("weblogic.security.CustomTrustKeyStorePassPhrase","TRUST_STORE_PASSWORD"); System.setProperty("weblogic.security.CustomTrustKeyStoreType","JKS"); URL url = new URL(endpoint+"?WSDL"); QName serviceName = new QName(TARGET_NAMESPACE, "HttpsBasicAuthService"); service = new HttpsBasicAuthService(); stub = service.getHttpsBasicAuthSoapPort(); BindingProvider bp = (BindingProvider) stub; Map<String,Object> context = bp.getRequestContext(); context.put(BindingProvider.USERNAME_PROPERTY, USERNAME) context.put(BindingProvider.PASSWORD_PROPERTY, PASSWORD); context.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, ENDPOINT); } catch (Exception e) { System.out.println("Error in creating the stub : " + e.getMessage()); if (verbose) e.printStackTrace(); } } public void invokeEchoString() throws Exception { String output = stub.echoString(ENDPOINT); System.out.println("[HttpsBasicAuthClient.invokeGEchoString]: " + output); } public static void main(String[] argv) throws Exception { HttpsBasicAuthClient client = new HttpsBasicAuthClient(); System.setProperty("weblogic.wsee.verbose","*"); System.out.println("----------------------"); System.out.println(" Invoking echoString "); client.invokeEchoString(); } }
デフォルトのJavaプロトコル・ハンドラを使用するスタンドアロンのJava Webサービス・クライアントのコードを例3-6に示します。
例3-6 java.netを使用するWebサービス・クライアントの一方向SSLの例
package httpbasicauth.client import java.net.URL; import java.security.cert.X509Certificate; import java.util.Map; import javax.xml.namespace.QName; import javax.xml.ws.BindingProvider; import httpsbasicauth.client.HttpsBasicAuthService; import httpsbasicauth.client.HttpsBasicAuth; public class HttpsBasicAuthClient private final static String ENDPOINT = .....; private final static String TARGET_NAMESPACE = "https://httpsbasicauth private final static String USERNAME = ....; private final static String PASSWORD = ....; private final static String TRUST_STORE_LOCATION = .....; private final static String TARGET_NAMESPACE = ....; private HttpsBasicAuthService service; private HttpsBasicAuth stub; public HttpsBasicAuthClient() { try { System.setProperty("java.protocol.handler.pkgs", "java.net"); System.setProperty("javax.net.ssl.trustStore", TRUST_STORE_LOCATION); System.setProperty("javax.net.ssl.trustStorePassword", TRUST_STORE_PASSWORD); URL url = new URL(ENDPOINT+"?WSDL"); QName serviceName = new QName(TARGET_NAMESPACE, "HttpsBasicAuthService"); service = new HttpsBasicAuthService(); stub = service.getHttpsBasicAuthSoapPort(); BindingProvider bp = (BindingProvider) stub; Map<String,Object> context = bp.getRequestContext(); context.put(BindingProvider.USERNAME_PROPERTY, USERNAME) context.put(BindingProvider.PASSWORD_PROPERTY, PASSWORD); context.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, ENDPOINT); } catch (Exception e) { System.out.println("Error in creating the stub : " + e.getMessage()); if (verbose) e.printStackTrace(); } } public void invokeEchoString() throws Exception { String output = stub.echoString(ENDPOINT); System.out.println("[HttpsBasicAuthClient.invokeGEchoString]: " + output); } public static void main(String[] argv) throws Exception { HttpsBasicAuthClient client = new HttpsBasicAuthClient(); System.setProperty("weblogic.wsee.verbose","*"); System.out.println("----------------------"); System.out.println(" Invoking echoString "); client.invokeEchoString(); } }
Antビルド・ファイルの関連部分を例3-7に示します。
例3-7 Antビルド・ファイル
<property name="output.dir" value="../../build/httpsbasicauth" /> <property name="service.dir" value="${output.dir}/httpsbasicauthApp" /> <property name="output.dir.client" value="${output.dir}/client" /> <property name="clientclasses.dir" value="${output.dir}/client" /> <property name="service.name" value="HttpsBasicAuth" /> <property name="wsdl.name" value="HttpsBasicAuthService" /> <property name="packageName" value="httpsbasicauth.client" /> <path id="client.class.path"> <pathelement path="${java.class.path}" /> <pathelement path="${clientclasses.dir}" /> </path> <taskdef name="clientgen" classname="weblogic.wsee.tools.anttasks.ClientGenTask" /> <taskdef name="jwsc" classname="weblogic.wsee.tools.anttasks.JwscTask"/> <target name="jwsc"> <jwsc srcdir="." destdir="${output.dir.server}" sourcepath="../" debug="true" keepGenerated="true"> <module name="HttpsBasicAuth" contextPath="httpsbasicauth"> <jws file="HttpsBasicAuth.java" type="JAXWS" generateWsdl="true"> <WLHttpTransport contextPath="httpsbasicauth" serviceUri="httpsbasicauth"/> </jws> </jwsc> </target> <target name="client"> <clientgen wsdl="jar:file:${service.dir}/${service.name}.war!/WEB-INF/${wsdl.name}.wsdl" type="JAXWS" destDir="${clientclasses.dir}" packageName="${packageName}"> </clientgen> <javac srcdir="${clientclasses.dir}" destdir="${clientclasses.dir}" includes="**/*.java" classpathref="client.class.path" /> <javac srcdir="./" destdir="${clientclasses.dir}" includes="HttpsBasicAuthClient.java" classpathref="client.class.path" /> </target> <target name="run"> <java classname="httpsbasicauth.client.HttpsBasicAuthClient" classpathref="client.class.path" fork="true" /> </target>
JAX-RPCクライアントは、SSL接続でのリクエストの状態を永続化するために、「信頼性のあるメッセージングでのカスタムSSLアダプタの使用(JAX-RPCのみ)」で説明されているSSLAdapterメカニズムを使用できます。その際に、接続の確立に使用されたカスタムSSLAdapterのインスタンスを永続化します。
Oracle WebLogic Serverは、システム・プロパティまたは新しいweblogic.wsee.jaxws.sslclient.PersistentSSLInfo classからSSLSocketFactoryを構成するために使用するJAX-WSの双方向SSLクライアントAPIを備えています。このAPIは、信頼性のあるメッセージング、コールバックなどのSSL情報を永続化することができ、次のよく知られたシステム・プロパティをサポートします。
weblogic.wsee.client.ssl.relaxedtrustmanager
weblogic.security.SSL.ignoreHostnameVerification
次の新しいクラスが使用できます。詳しい説明は、Javadocを参照してください。
weblogic.wsee.jaxws.sslclient.SSLClientUtil。このクラスには、次のメソッドがあります。
public static SSLSocketFactory getSSLSocketFactory(KeyManager[] kms, TrustManager[] tms)
public static SSLSocketFactory getSSLSocketFactory(PersistentSSLInfo sslInfo)
public static SSLSocketFactory getSSLSocketFactoryFromSysProperties()
weblogic.wsee.jaxws.sslclient.PersistentSSLInfo (SSL情報を設定するためのJavabean)。
weblogic.wsee.jaxws.JAXWSProperties (CLIENT_PERSISTENT_SSL_INFOプロパティを含む)。
例3-8は、システム・プロパティからSSLSocketFactoryを取得してリクエスト・コンテキストで使用する例を示しています。
注意: clientKeyStoreとclientKeyStorePasswdには、Java SEのSSLパッケージを使用する場合に、クライアントの秘密鍵のパスワードとクライアントのキーストアのパスワードが同一であることが求められるという制約があります。そのため、クライアント・キーストアには秘密鍵とX.509証明書のペアを1つしか格納できません。 |
例3-8 システム・プロパティからのSSLSocketFactoryの取得
String clientKeyStore = ...; String clientKeyStorePasswd = ...; String trustKeystore = ...; String trustKeystorePasswd = ...; System.setProperty("javax.net.ssl.keyStore", clientKeyStore); System.setProperty("javax.net.ssl.keyStorePassword", clientKeyStorePasswd); System.setProperty("javax.net.ssl.trustStore", trustKeystore); System.setProperty("javax.net.ssl.trustStorePasswd", trustKeystorePasswd); ((BindingProvider) port).getRequestContext().put( JAXWSProperties.SSL_SOCKET_FACTORY, SSLClientUtil.getSSLSocketFactoryFromSysProperties());
例3-9は、永続情報(PersistentSSLInfo)からSSLSocketFactoryを取得し、永続性が不要な場合はSSLSocketFactoryを直接設定する例を示しています。
例3-9 PersistentSSLInfoからのSSLSocketFactoryの取得
String clientKeyStore = ...; String clientKeyStorePasswd = ...; String clientKeyAlias = ...; String clientKeyPass = ...; String trustKeystore = ...; String trustKeystorePasswd = ...; PersistentSSLInfo sslInfo = new PersistentSSLInfo(); sslInfo.setKeystore(clientKeyStore); sslInfo.setKeystorePassword(clientKeyStorePasswd); sslInfo.setKeyAlias(clientKeyAlias); sslInfo.setKeyPassword(clientKeyPass); sslInfo.setTrustKeystore(trustKeystore); //user can print out the sslInfo for debug System.out.print(sslInfo.toString()); //Put sslInfo into requestContext for persistence, it might be required by JAX-WS advance features, such as, RM, Callback ((BindingProvider) port).getRequestContext().put( JAXWSProperties.CLIENT_PERSISTENT_SSL_INFO, sslInfo); //Alternatively, you can directly set a SSLSocketFactory if persistence is not necessary. Note: The following line should be omitted if sslInfo is set with above line. ((BindingProvider) port).getRequestContext().put( JAXWSProperties.SSL_SOCKET_FACTORY, SSLClientUtil.getSSLSocketFactory(sslInfo));
sslInfoでは、クライアント・キーストアに複数のキーがある場合にキーストア内のキーを(SSLのクライアント側キーとして)示す、キー別名(clientKeyAlias)を設定できます。
UserDataConstraint
アノテーションを指定すると、HTTPSトランスポートを使用してWebサービスを呼び出すことが必要となります。
JWSファイルでUserDataConstraint
アノテーションを使用してトランスポート・レベルのWebサービス・セキュリティを構成するには:
WebLogic Serverコア・セキュリティ・サブシステムに対してSSLを構成します。
一方向のSSL (WebLogic Serverがクライアント・アプリケーションに証明書を提示する必要があります)、または双方向のSSL (クライアント・アプリケーションとWebLogic Serverが両方とも互いに証明書を提示する必要があります)のいずれかを構成できます。
WebLogic Serverのコア・セキュリティ・サブシステムに対して双方向または一方向のSSLを構成する場合は、『Oracle WebLogic Serverの保護』のSSLの構成に関する項を参照してください。
Webサービスを実装するJWSファイル内に@weblogic.jws.security.UserDataConstraint
アノテーションを追加し、Webサービスの呼出しにHTTPSトランスポートの使用が必要となるようにします。
詳細は、Oracle WebLogic Server WebLogic Webサービス・リファレンスのweblogic.jws.security.UserDataConstraintに関する項を参照してください。
通常の反復的な開発プロセスの一部として、Webサービスを再コンパイルして再デプロイします。
Oracle WebLogic Server JAX-RPC Webサービス・スタート・ガイドのWebLogic Webサービスの開発に関する項を参照してください。
clientgen
Antタスクを呼び出すbuild.xml
ファイルを更新して、WebサービスのJAX-RPCスタブの生成に、デプロイされているサービスの動的WSDLではなく、静的WSDLを使用するようにします。
この場合に、clientgen
が動的WSDLからスタブを生成できない理由は、@UserDataConstraint
アノテーションを指定する際に、すべてのクライアント・アプリケーションで、clientgen
を含む信頼ストアを指定することが必要であるためです。ただし現在、clientgen
で信頼ストアを指定する方法はありません。したがって、Antタスクは、動的WSDLと同じ方法でWebサービスを記述する静的なWSDLからクライアント・コンポーネントを生成しなければなりません。
Webサービスを呼び出すクライアント・アプリケーションを実行するときは、アプリケーションで使用するSSL実装を示す特定のプロパティを指定します。特に:
SunのSSL実装を指定するには、次のプロパティを使用します。
-Djavax.net.ssl.trustStore=trustStore
trustStoreには、信頼性のある証明書のリスト(必ずサーバーの証明書を1つ含む)を格納するクライアント側の信頼ストアの名前を指定します。ホスト名検証を無効にするには、次のプロパティも指定します。
-Dweblogic.wsee.client.ssl.stricthostchecking=false
双方向SSLの詳細は、「クライアント・アプリケーションでの双方向SSLの構成」を参照してください。
注意: StubおよびMessageContextプロパティに格納されるすべてのオブジェクトは、シリアライズ可能かつ外部化可能であること、およびサーバーのシステムCLASSPATHにその実装が指定されていることが必要です。この項では、カスタムSSLAdapterを実装する場合について説明します。 |
カスタムSSLAdapter実装を使用すると、信頼性のあるメッセージングまたはバッファリングを使用する場合に、クライアントとサーバーの間のSSL接続を確立するために必要なクライアント証明書とその他のサービスを提供できます。信頼性のあるメッセージングおよびバッファリングのサブシステムは、SSL接続の間、リクエストの状態を永続化します。その際に、接続の確立に使用されたカスタムSSLAdapterのインスタンスを永続化します。
リクエストを永続化から復元する際に、リクエストとともに保存されていたカスタムSSLAdapterオブジェクトを正しく復元するには、永続化機能がカスタムSSLAdapterクラスにアクセスできることが必要です。これを可能にするには、(サーバーにデプロイされたアプリケーションの内部ではなく)サーバーのシステムCLASSPATHを通じて、カスタムSSLAdapterクラスを提供する必要があります。
カスタムSSLAdapterは、SSLAdapterを拡張したものであることが必要であり、次の手順でインストールおよび有効化します。
weblogic.wsee.connection.transport.https.HttpsTransportInfo
のインスタンスを作成します。
HttpsTransportInfo.setSSLAdapter(SSLAdapter adapter)
を呼び出して、そのトランスポート情報にカスタムSSLアダプタを設定します。
次のメソッドを呼び出して、Webサービス・スタブ・インスタンス(javax.xml.rpc.Stub型のスタブ)
にトランスポート情報を設定します。
stub._setProperty(weblogic.wsee.connection.soap.SoapClientConnection.TRANSPORT_INFO_PROPERTY,ti);
stub
はWebサービス・スタブ、ti
は構成したHttpsTransportInfo
です。
この手順に従ってカスタムSSLAdapterクラスをシステムCLASSPATHに指定しないと、ClassNotFoundException
例外が生成されます。
java.io.IOException: java.lang.ClassNotFoundException: examples.webservices.client.ServiceBase$TestSSLAdapter