ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebLogic Server WebLogic Webサービスの保護
11g リリース1 (10.3.6)
B61620-05
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次

前
 
次
 

3 トランスポート・レベルのセキュリティの構成

この章ではJava API for XML Web Services (JAX-WS)とJava API for XML-based RPC (JAX-RPC)を使用して、WebLogic Webサービスでトランスポート・レベルのセキュリティを構成する方法について説明します。

トランスポート・レベルのセキュリティとは、クライアント・アプリケーションとWebサービスとの間の接続をSecure Sockets Layer (SSL)で保護することです。

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基本認証の両方が必要です。

例3-3 ポリシーでのSSLおよびHTTP基本認証

<sp:TransportToken>
<wsp:Policy>
<sp:HttpsToken>
<wsp:Policy>
<sp:HttpBasicAuthentication/>
</wsp:Policy>
</sp:HttpsToken>
</wsp:Policy>
</sp:TransportToken>

使用可能なトランスポート・レベルのポリシー

これらのポリシーでは、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では、SAML 1.1トークンを使用し、Bearer確認メソッドによって認証を行います。

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。受信側で、発信元のパブリック証明書をチェックします。認証にクライアント証明書を使用することも可能です。


前提条件: 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の設定: 主な手順」を参照してください。

SSLを設定するには、次の手順に従います。

  1. アイデンティティと信頼を構成します(「アイデンティティと信頼の構成」を参照)。

    1. CertGenユーティリティ、keytoolユーティリティ、またはEntrustやVerisignなどの信頼できるベンダーから、デジタル証明書、秘密鍵および信頼性のあるCA証明書を取得します。WebLogic Serverのキットに用意されているデジタル証明書、秘密鍵、および信頼性のあるCA証明書を使用することもできます。デモ用のデジタル証明書、秘密鍵、および信頼性のあるCA証明書は、開発環境でのみ使用してください。

    2. 秘密鍵、デジタル証明書、および信頼性のあるCA証明書を格納します。秘密鍵と信頼性のあるCA証明書は、キーストアに格納します。

    3. WebLogic Server管理コンソールで、WebLogic ServerのIDキーストアと信頼キーストアを構成します。Oracle WebLogic Server管理コンソール・オンライン・ヘルプのキーストアの構成に関する項を参照してください。

  2. WebLogic Server管理コンソールで、秘密鍵の別名とパスワードに関するSSL構成オプションを設定します。

    必要な場合、クライアント証明書の提示を必須とする構成オプションを設定します(双方向SSLの場合)。Oracle WebLogic Server管理コンソール・ヘルプの双方向SSLの構成に関する項を参照してください。

クライアント・アプリケーションでの双方向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サービス・セキュリティを構成するには:

  1. 「前提条件: SSLの構成」に記載されているように、WebLogic Serverコア・セキュリティ・サブシステムに対してSSLを構成します。

    一方向のSSL (WebLogic Serverがクライアント・アプリケーションに証明書を提示する必要がある)、または双方向のSSL (クライアント・アプリケーションとWebLogic Serverが両方とも互いに証明書を提示する必要がある)のいずれかを構成できます。

    WebLogic Serverのコア・セキュリティ・サブシステムに対して双方向または一方向のSSLを構成する場合は、『Oracle WebLogic Serverの保護』のSSLの構成に関する項を参照してください。

  2. JWSファイルで@Policyまたは@Policies JWSアノテーションを使用するか、管理コンソールを使用して実行時にポリシー・ファイルを関連付けます。あるいは、アノテーションを使用して一部のポリシー・ファイルを指定し、実行時に追加のポリシー・ファイルを関連付けます。

    使用可能なトランスポート・レベルのポリシーの詳細は、表3-1を参照してください。


    注意:

    Webサービスにトランスポート・レベルのセキュリティ・ポリシーを指定する場合、ポリシーの指定はクラス・レベルで行う必要があります。

    また、トランスポート・レベルのセキュリティ・ポリシーは着信方向と発信方向の両方に適用する必要があります。つまり、着信にHTTPSを使用し、発信にHTTPを使用することはできません。


    次の例では、ポリシーをクラス・レベルでアタッチしています。

    @Policy(uri="policy:Wssp1.2-2007-Saml2.0-Bearer-Https.xml")
    public class EchoService {
       ....
    
  3. JWSファイルに@Policyまたは@Policies JWSアノテーションを追加した場合は、通常の反復的開発プロセスの一環として、Webサービスをコンパイルして再デプロイします。

  4. Webサービスを呼び出すクライアント・アプリケーションを実行するときは、アプリケーションで使用するSSL実装を示す特定のプロパティを指定します。特に:

    • Certicom SSL実装を指定するには、次のプロパティを使用します

      -Djava.protocol.handler.pkgs=weblogic.net
      -Dweblogic.security.SSL.trustedCAKeyStore=trustStore  
      

      trustStoreには、信頼性のある証明書のリスト(必ずサーバーの証明書を1つ含む)を格納するクライアント側の信頼ストアの名前を指定します。ホスト名検証を無効にするには、次のプロパティも指定します。

      -Dweblogic.security.SSL.ignoreHostnameVerification=true
      
    • SunのSSL実装を指定するには、次のプロパティを使用します。

      -Djavax.net.ssl.trustStore=trustStore  
      

      trustStoreには、信頼性のある証明書のリスト(必ずサーバーの証明書を1つ含む)を格納するクライアント側の信頼ストアの名前を指定します。ホスト名検証を無効にするには、次のプロパティも指定します。

      -Dweblogic.wsee.client.ssl.stricthostchecking=false
      

      双方向SSLの詳細は、「クライアント・アプリケーションでの双方向SSLの構成」を参照してください。

JAX-WSのトランスポート・セキュリティの構成例

この項では、スタンドアロンの一方向SSLクライアントからトランスポート・セキュリティを使用したJAX-WSを構成するための単純な例について説明します。

その他の前提条件については、次のドキュメントを参照してください。

一方向SSL (HTTPSおよびHTTP基本認証の例)

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>

SSLにおけるリクエストの状態の永続化(JAX-WSのみ)

JAX-RPCクライアントはSSL接続でのリクエストの状態を永続化するために、「信頼性のあるメッセージングでのカスタムSSLアダプタの使用(JAX-RPCのみ)」で説明されたSSLAdapterメカニズムを使用できます。その際に、接続の確立に使用されたカスタムSSLAdapterのインスタンスを永続化します。

Oracle WebLogic Serverには、システム・プロパティまたは新しいweblogic.wsee.jaxws.sslclient.PersistentSSLInfo classからSSLSocketFactoryを構成するために使用するJAX-WSのための双方向SSLクライアントAPIが用意されています。このAPIは、信頼性のあるメッセージング、コールバックなどのSSL情報を永続化することができ、次のよく知られたシステム・プロパティをサポートします。

次の新しいクラスが使用できます。詳しい説明は、Javadocを参照してください。

システム・プロパティからSSLSocketFactoryを取得する例

例3-8は、システム・プロパティからSSLSocketFactoryを取得してリクエスト・コンテキストで使用する例を示しています。


注意:

clientKeyStoreclientKeyStorePasswdには、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によるトランスポート・レベルのセキュリティの構成: 主な手順(JAX-RPCのみ)

UserDataConstraintアノテーションを指定すると、HTTPSトランスポートを使用してWebサービスを呼び出すことが必要となります。

JWSファイルでUserDataConstraintアノテーションを使用してトランスポート・レベルのWebサービス・セキュリティを構成するには:

  1. WebLogic Serverコア・セキュリティ・サブシステムに対してSSLを構成します。

    一方向のSSL (WebLogic Serverがクライアント・アプリケーションに証明書を提示する必要がある)、または双方向のSSL (クライアント・アプリケーションとWebLogic Serverが両方とも互いに証明書を提示する必要がある)のいずれかを構成できます。

    WebLogic Serverのコア・セキュリティ・サブシステムに対して双方向または一方向のSSLを構成する場合は、『Oracle WebLogic Serverの保護』のSSLの構成に関する項を参照してください。

  2. Webサービスを実装するJWSファイル内に@weblogic.jws.security.UserDataConstraintアノテーションを追加し、Webサービスの呼出しにHTTPSトランスポートの使用が必要となるようにします。

    詳細は、『Oracle WebLogic Server WebLogic Webサービス・リファレンス』のweblogic.jws.security.UserDataConstraintに関する項を参照してください。

  3. 通常の反復的な開発プロセスの一部として、Webサービスを再コンパイルして再デプロイします。

    『Oracle WebLogic Server JAX-RPC Webサービス・スタート・ガイド』のWebLogic Webサービスの開発に関する項を参照してください。

  4. clientgen Antタスクを呼び出すbuild.xmlファイルを更新して、WebサービスのJAX-RPCスタブの生成に、デプロイされているサービスの動的WSDLではなく、静的WSDLを使用するようにします。

    この場合に、clientgenが動的WSDLからスタブを生成できない理由は、@UserDataConstraintアノテーションを指定する際に、すべてのクライアント・アプリケーションで、clientgenを含む信頼ストアを指定することが必要であるためです。ただし現在、clientgenで信頼ストアを指定する方法はありません。したがって、Antタスクは、動的WSDLと同じ方法でWebサービスを記述する静的なWSDLからクライアント・コンポーネントを生成しなければなりません。

  5. Webサービスを呼び出すクライアント・アプリケーションを実行するときは、アプリケーションで使用するSSL実装を示す特定のプロパティを指定します。特に:

    • Certicom SSL実装を指定するには、次のプロパティを使用します

      -Djava.protocol.handler.pkgs=weblogic.net
      -Dweblogic.security.SSL.trustedCAKeyStore=trustStore 
      

      trustStoreには、信頼性のある証明書のリスト(必ずサーバーの証明書を1つ含む)を格納するクライアント側の信頼ストアの名前を指定します。ホスト名検証を無効にするには、次のプロパティも指定します。

      -Dweblogic.security.SSL.ignoreHostnameVerification=true
      
    • SunのSSL実装を指定するには、次のプロパティを使用します。

      -Djavax.net.ssl.trustStore=trustStore  
      

      trustStoreには、信頼性のある証明書のリスト(必ずサーバーの証明書を1つ含む)を格納するクライアント側の信頼ストアの名前を指定します。ホスト名検証を無効にするには、次のプロパティも指定します。

      -Dweblogic.wsee.client.ssl.stricthostchecking=false
      

      双方向SSLの詳細は、「クライアント・アプリケーションでの双方向SSLの構成」を参照してください。

信頼性のあるメッセージングでのカスタムSSLアダプタの使用(JAX-RPCのみ)


注意:

StubおよびMessageContextプロパティに格納されるすべてのオブジェクトは、シリアライズ可能かつ外部化可能であること、およびサーバーのシステムCLASSPATHにその実装が指定されていることが必要です。この項では、カスタムSSLAdapterを実装する場合について説明します。


カスタムSSLAdapter実装を使用すると、信頼性のあるメッセージングまたはバッファリングを使用する場合に、クライアントとサーバーの間のSSL接続を確立するために必要なクライアント証明書とその他のサービスを提供できます。信頼性のあるメッセージングおよびバッファリングのサブシステムは、SSL接続の間、リクエストの状態を永続化します。その際に、接続の確立に使用されたカスタムSSLAdapterのインスタンスを永続化します。

リクエストを永続化から復元する際に、リクエストとともに保存されていたカスタムSSLAdapterオブジェクトを正しく復元するには、永続化機能がカスタムSSLAdapterクラスにアクセスできることが必要です。これを可能にするには、(サーバーにデプロイされたアプリケーションの内部ではなく)サーバーのシステムCLASSPATHを通じて、カスタムSSLAdapterクラスを提供する必要があります。

カスタムSSLAdapterは、SSLAdapterを拡張したものであることが必要であり、次の手順でインストールおよび有効化します。

  1. weblogic.wsee.connection.transport.https.HttpsTransportInfoのインスタンスを作成します。

  2. HttpsTransportInfo.setSSLAdapter(SSLAdapter adapter)を呼び出して、そのトランスポート情報にカスタムSSLアダプタを設定します。

  3. 次を呼び出して、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