ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebLogic Server Web サービスのセキュリティ
11g リリース 1 (10.3.1)
B55522-01
 

目次
目次

戻る
戻る
 
次へ
次へ
 

3 転送レベルのセキュリティのコンフィグレーション

転送レベルのセキュリティとは、セキュア ソケット レイヤ (SSL) と HTTP 基本認証のいずれか、または両方を使用して、クライアントと Web サービスの間の接続を保護することです。

SSL では、ネットワーク接続している 2 つのアプリケーションが互いの ID を認証できるようにするとともに、アプリケーション間でやりとりされるデータを暗号化することでセキュアな接続が実現します。認証を使用すると、サーバは (場合によってはクライアントも) ネットワーク接続の相手側アプリケーションの ID を検証できます。クライアント証明書 (双方向 SSL) を使用してユーザを認証できます。

SSL に関する一般情報と WebLogic Server に含む実現については、『Oracle Fusion Middleware Oracle WebLogic Server Security について』の「セキュア ソケット レイヤ (SSL)」を参照してください。

以下の節では、Web サービスの転送レベルのセキュリティをコンフィグレーションする方法について説明します。

ポリシーによる転送レベルのセキュリティのコンフィグレーション

SSL、HTTP 基本認証、またはその両方を必要とするポリシーを指定できます。

ポリシーで SSL を必要とする場合は、必ず WebLogic Server のコア セキュリティ サブシステムで SSL をコンフィグレーションします。一方向の SSL (WebLogic Server がクライアント アプリケーションに証明書を提示する必要がある)、または双方向の SSL (クライアント アプリケーションと WebLogic Server が両方とも互いに証明書を提示する必要がある) のいずれかをコンフィグレーションできます。

コア WebLogic Server セキュリティサブシステムのために双方向の、または、一方向の SSL を構成するために, 『Oracle Fusion Middleware Oracle WebLogic Server のセキュリティ』の「SSL のコンフィグレーション」を参照してください。

たとえば、Oracle によって供給されたWssp1.2-2007-Saml2.0-Bearer-Https.xml ポリシー ファイルはポリシーが コード リスト 3-1 に示されているように SSL を通してクライアント証明書を予想している以下のアサーションを含んでいます。

コード リスト 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>

ポリシーによる転送レベルのセキュリティのコンフィグレーション : 主な手順

1 つまたは複数のポリシー ファイルを使用して転送レベルの Web サービス セキュリティをコンフィグレーションするには、次の手順に従います。

  1. WebLogic Server コア セキュリティ サブシステムに対して SSL をコンフィグレーションします。

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

    コア WebLogic Server セキュリティサブシステムのために双方向の、または、一方向の SSL を構成するために 『Oracle Fusion Middleware Oracle WebLogic Server のセキュリティ』の「SSL のコンフィグレーション」を参照してください。

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

  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 に示します。

コード リスト 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")
 
// HttpsとHttp基本認証に関する安全保障ポリシー
@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 Web サービス クライアント weblogic.net 付き一方向 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 {
      // これは Server によって使用された Public Certificate のために検証というホスト名を無視します 
      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 Web サービス クライアント java.net 付き一方向 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-WS のための新しい双方向永続 SSL クライアント API

JAX-RPC クライアントは SSL 接続での要求の状態を固持するためには信頼性のあるメッセージングでのカスタム SSL アダプタの使用で説明された SSLAdapter メカニズムを使用できます。その際に、サブシステムは接続の確立に使用されたカスタム SSLAdapter のインスタンスを保持します。

Oracle WebLogic Server のリリースは、システム プロパティからSSLSocketFactory、または、新しいweblogic.wsee.jaxws.sslclient.PersistentSSLInfo classから構成するために使用する JAX-WS のための新しい双方向 SSL クライアント API を含んでいます。API は、メッセージングの信頼性、コールバックなどのための SSL インフォメーションを保持でき、以下の既知のシステムのプロパティをサポートします

以下の新しいクラスは利用可能です。完全記述に関しては、Javadoc を参照してください。

システム プロパティから SSLSocketFactory を取得ことの例

コード リスト 3-8 はシステム プロパティからSSLSocketFactory を取得して要求コンテキストでそれらを使用することの例を示します。


注意 :

clientKeyStoreclientKeyStorePasswd には、この制限があります: J2SE のSSL パッケージは、クライアントのプライベート キーのパスワードがクライアントのキーストアに関するパスワードと同じであることが必要です。この理由で、クライアント キーストアは一つプライベート キーと X.509 証明書のペアを含むことができます。

コード リスト 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);
      
      //ユーザはデバッグのために sslInfo を印刷できます。
      System.out.print(sslInfo.toString());
 
//固執のために requestContext に sslInfo を入れてください、それが JAX-WS の RM、Callback などの高度な機能によって必要される場合があります。
      ((BindingProvider) port).getRequestContext().put(
        JAXWSProperties.CLIENT_PERSISTENT_SSL_INFO, sslInfo);
        
      //あるいはまた、固執は必要でないなら、あなたが直接SSLSocketFactory を設定できます。注意 : sslInfo が上の系列で用意ができているなら、以下の系列は省略されるべきです。      ((BindingProvider) port).getRequestContext().put(
        JAXWSProperties.SSL_SOCKET_FACTORY, 
        SSLClientUtil.getSSLSocketFactory(sslInfo));

sslInfo は、 (clientKeyAlias) キーのエリアスxを設定できます。クライアントキーストアに複数のキーがある場合、これはキーストア(SSLのクライアントサイドキーとしての)にキーを示します。

UserDataConstraint による転送レベルのセキュリティのコンフィグレーション : 主な手順 (JAX-RPC のみ)

UserDataConstraint アノテーションでは、Web サービスが HTTPS 転送を使用して呼び出されることを要求します。

JWS ファイルで UserDataConstraint アノテーションを使用して転送レベルの Web サービス セキュリティをコンフィグレーションするには、次の手順に従います。

  1. WebLogic Server コア セキュリティ サブシステムに対して SSL をコンフィグレーションします。

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

    コア WebLogic Server セキュリティサブシステムのために双方向の、または、一方向の SSL を構成するために『Oracle Fusion Middleware Oracle WebLogic Server セキュリティ』の「 SSL のコンフィグレーション」を参照してください。

  2. Web サービスを実装する JWS ファイル内に @weblogic.jws.security.UserDataConstraint アノテーションを追加し、Web サービスが HTTPS 転送を使用して呼び出されることを要求します。

    詳細については、『Oracle Fusion Middleware Oracle WebLogic Server コマンド リファレンス』の「weblogic.jws.security.UserDataConstraint」を参照してください。

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

    Oracle Fusion Middleware 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 のコンフィグレーション

WebLogic Server で双方向 SSL をコンフィグレーションした場合は、一方向 SSL で必要なように WebLogic Server がクライアント アプリケーションに証明書を提示するだけでなく、クライアント アプリケーションも WebLogic Server に証明書を提示する必要があります。さらに、以下の要件も満たしている必要があります。

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


注意 :

Stub および MessageContext プロパティに格納されるすべてのオブジェクトはシリアライズ可能か外部化可能でなければならず、サーバのシステム CLASSPATH でその実装を使用できるようにする必要があります。この節では特定のケースのカスタム SSLAdapter 実装について説明します。

信頼性のあるメッセージングまたはバッファリングを使用するとき、クライアントとサーバとの SSL 関係を確立するのに必要であるクライアント証明書と他のサービスを提供するのにカスタムSSLAdapter実現を使用できます。信頼性のあるメッセージングおよびバッファリングのサブシステムは、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