ナビゲーションをスキップ

WebLogic Security プログラマーズ ガイド

  前 次 前/次ボタンと目次ボタンとの区切り線 目次  

Java クライアントでの SSL 認証の使用

この節では、以下の内容について説明します。

 


JSSE と WebLogic Server

JSSE は、SSL と TLS v1 プロトコルをサポートおよび実装し、それらの機能をプログラム的に利用可能にするパッケージのセットです。BEA WebLogic Server は、WebLogic Server クライアントとサーバ、Java クライアント、Web ブラウザ、および他のサーバの間で転送されるデータを暗号化するためにセキュア ソケット レイヤ (SSL) をサポートしています。

WebLogic クライアントでは WebLogic Server による JSSE (Java Secure Socket Extension) の実装を使用できますが、これは必須ではありません。他の JSSE の実装も、サーバの外側のクライアントサイドのコードで同じように使用できます。

WebLogic のサーバサイド アプリケーションで SSL を使用する際には、以下の制限が適用されます。

WebLogic Server では、SSL に HTTPS ポートを使用します。このポートで使用できるのは SSL のみです。SSL は、ユーザ ID とパスワードがクリア テキストでは転送されないように、クライアントと WebLogic Server との間で転送されるデータを暗号化します。

注意 : WebLogic クライアントでセキュリティを実装するためには、Java クライアントで WebLogic Server ソフトウェア配布キットをインストールする必要があります。

 


JNDI 認証の使い方

Java クライアントは、Java Naming and Directory Interface (JNDI) を使用して WebLogic Server に資格を渡します。Java クライアントは、JNDI InitialContext を取得して WebLogic Server との通信を確立します。その後、InitialContext を使用して、WebLogic Server JNDI ツリーで必要なリソースをルックアップします。

注意 : JAAS は認証方法として望ましい選択肢ですが、認証プロバイダの LoginModule はユーザ名とパスワードの認証しかサポートしていません。したがって、クライアントの証明書認証 (双方向 SSL 認証ともいう) では JNDI を使用します。クライアントの証明書認証に JAAS を使用するには、LoginModule で証明書の認証を行うカスタム認証プロバイダを記述する必要があります。

ユーザとユーザの資格を指定するには、表 4-1 で示されている JNDI プロパティを設定します。

表 4-1 認証に使用される JNDI プロパティ 

プロパティ

意味

INITIAL_CONTEXT_FACTORY

エントリ ポイントを WebLogic Server 環境に提供する。クラス weblogic.jndi.WLInitialContextFactory は WebLogic Server 用の JNDI SPI。

PROVIDER_URL

ネーム サービスを提供する WebLogic Server のホストとポートを指定する。例 : t3s://weblogic:7002

SECURITY_PRINCIPAL

ユーザがデフォルトの (アクティブな) セキュリティ レルムに対して認証されているときのユーザの ID を指定する。


 

これらのプロパティは、InitialContext コンストラクタに渡されるハッシュ テーブルに格納されます。WebLogic Server 独自の SSL である t3s が使用されていることに注意してください。t3s は、暗号化を利用して、WebLogic Server と Java クライアントの間の接続と通信を保護します。

コード リスト 4-1 は、Java クライアントで一方向 SSL 証明書認証を使用する方法を示しています。双方向 SSL 認証のコード例については、コード リスト 4-5 を参照してください。

コード リスト 4-1JNDI を使用する一方向 SSL 認証の例

...
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"weblogic.jndi.WLInitialContextFactory");
env.put(Context.PROVIDER_URL, "t3s://weblogic:7002");
env.put(Context.SECURITY_PRINCIPAL, "javaclient");
env.put(Context.SECURITY_CREDENTIALS, "javaclientpassword");
ctx = new InitialContext(env);

注意 : JNDI コンテキストとスレッドの詳細と、JNDI コンテキストの潜在的な問題を回避する方法については、『WebLogic JNDI プログラマーズ ガイド』の「JNDI コンテキストとスレッド」および「JNDI コンテキストの問題の回避方法」を参照してください。

 


SSL 証明書認証の開発環境

この節では、以下の内容について説明します。

SSL 認証 API

WebLogic Server で SSL 認証を使用する Java クライアントを実装するには、Java SDK 1.3 アプリケーション プログラミング インタフェース (API) と WebLogic API を組み合わせて使用します。

表 4-2 では、証明書認証の実装に使用される Java SDK API パッケージについて説明します。表 4-2 の情報は Java SDK API のマニュアルから取られており、WebLogic Server 固有の情報がコメントで追加されています。Java SDK API の詳細については、「http://java.sun.com/j2se/1.4.1/docs/api/index.html」および http://java.sun.com/j2ee/1.4/docs/api/index.html の Javadoc を参照してください。

表 4-3 では、証明書認証の実装に使用される WebLogic API について説明します。詳細については、WebLogic クラスの Javadoc を参照してください。

表 4-2 Java SDK 証明書 API 

Java SDK 証明書 API

説明

javax.crypto

このパッケージは暗号操作のためのクラスとインタフェースを提供する。このパッケージで定義されている暗号操作には、暗号化、鍵の生成と照合、および Message Authentication Code (MAC) の生成が含まれる。

暗号化のサポートには、対称、非対称、ブロック、およびストリームの各暗号方式が含まれている。このパッケージは、セキュア ストリームおよび暗号化されたオブジェクトもサポートしている。

このパッケージで提供されるクラスの多くは、プロバイダベースである (java.security.Provider クラスを参照)。クラス自体では、アプリケーションを記述できるプログラミング インタフェースが定義されている。独立したサードパーティ ベンダは、必要に応じて、実装自体を作成し、シームレスに組み込むことができる。したがって、アプリケーション開発者は、コードを追加したり書き直したりしなくても、プロバイダベースの実装をいくつでも利用できる。

javax.net

このパッケージはネットワーク アプリケーション用のクラスを提供する。ソケット作成用のファクトリが含まれている。ソケット ファクトリを使うと、ソケットの作成とコンフィグレーションの動作をカプセル化できる。

javax.net.SSL

このパッケージのクラスとインタフェースは WebLogic Server でサポートされているが、WebLogic Server で SSL を使用するときには weblogic.security.SSL パッケージの使用が望ましい。

java.security.cert

このパッケージは、証明書、証明書失効リスト (CRL)、および証明書パスの解析と管理を行うためのクラスとインタフェースを提供する。X.509 v3 証明書および X.509 v2 CRL のサポートが含まれている。

java.security.KeyStore

このクラスは、鍵と証明書のメモリ内コレクションを表す。以下の 2 タイプのキーストア エントリの管理に使用される。

  • キー エントリ

このタイプのキーストア エントリは、非常に機密性の高い暗号鍵情報を保持している。これは不正アクセスを防ぐため、保護された形式で格納される。

通常、このタイプのエントリに格納された鍵は、対応する公開鍵の証明書チェーンを伴う秘密鍵またはプライベート キーである。

プライベート キーおよび証明書チェーンは、自動認証のための指定されたエンティティによって使用される。この認証のためのアプリケーションには、ソフトウェアのリリースやライセンス付与の一環として JAR ファイルに署名するソフトウェア配布組織が含まれる。

  • 信頼性のある証明書エントリ

このタイプのエントリには、別の相手に属する単一の公開鍵が含まれる。これは信頼性のある証明書と呼ばれる。その証明書内の公開鍵が、実際に証明書のサブジェクト (オーナー) によって識別される ID に属するものであるとキーストアのオーナーが信頼するからである。

このタイプのエントリは、他の相手を認証するのに使用できる。

java.security.PrivateKey

プライベート キー。このインタフェースには、メソッドまたは定数が含まれない。すべてのプライベート キー インタフェースのグループ化 (およびタイプ保証) を行う役割を持つのみである。

注意 : 専用のプライベート キー インタフェースは、このインタフェースを拡張したものである。たとえば、java.security.interfacesDSAPrivateKey インタフェースを参照。

java.security.Provider

このクラスは、Java Security API の「暗号サービス プロバイダ」を表す。プロバイダは、以下のような Java Security の一部または全部を実装する。

  • アルゴリズム (DSA、RSA、MD5、SHA-1 など)

  • キーの生成、変換、および管理機能 (アルゴリズム固有キーなど)

各プロバイダには名前とバージョン番号が付いており、インストールされる各実行時においてコンフィグレーションされる。

暗号サービスの実装を提供するには、開発者チームまたはサード パーティのベンダが実装コードを記述し、Provider クラスのサブクラスを作成する。

javax.servlet.http.
HttpServletRequest

このインタフェースは、ServletRequest インタフェースを拡張して、HTTP サーブレットのリクエスト情報を提供する。

サーブレット コンテナは、HttpServletRequest オブジェクトを作成し、サーブレットのサービス メソッド (doGetdoPost など) に引数として渡す。

javax.servlet.http.
HttpServletResponse

このインタフェースは、ServletResponse インタフェースを拡張して、応答送信の際に HTTP 固有の機能を提供する。たとえば、このインタフェースには HTTP ヘッダおよびクッキーにアクセスする方法が含まれる。

サーブレット コンテナは、HttpServletRequest オブジェクトを作成し、サーブレットのサービス メソッド (doGetdoPost など) に引数として渡す。

javax.servlet.
ServletOutputStream

このクラスは、バイナリ データをクライアントに送信するための出力ストリームを提供する。ServletOutputStream オブジェクトは通常、ServletResponse.getOutputStream() メソッドを通じて取得される。

これは、サーブレット コンテナが実装する抽象クラスである。このクラスのサブクラスは、java.io.OutputStream.write(int) メソッドを実装する必要がある。

javax.servlet.
ServletResponse

このクラスは、クライアントに応答を送信する際にサーブレットを支援するオブジェクトを定義する。サーブレット コンテナは、ServletResponse オブジェクトを作成し、サーブレットのサービス メソッド (doGetdoPost など) に引数として渡す。


 

表 4-3 WebLogic 証明書 API 

WebLogic 証明書 API

説明

weblogic.net.http.
HttpsURLConnection

リモートのオブジェクトに Hypertext Transfer Protocol with SSL (HTTPS) を提示するのに使用されるクラスを提供する。このクラスは、クライアントとして機能している WebLogic Server から別の WebLogic Server への発信 SSL 接続を確立するために使われる。

weblogic.security.SSL.
HostnameVerifierJSSE

このインタフェースは、接続先のホストと証明書の SubjectDN のサーバ名が一致しなければならない場合を扱うポリシーをこのインタフェースの実装側で指定できるように、コールバック メカニズムを提供する。

サーバで使用するこのインタフェースのインスタンスを指定するには、サーバ (たとえば myserver) の [キーストア & SSL] タブの [詳細オプション] ペインにある [クライアント属性] フィールドで、カスタム ホスト名検証のクラスを設定する。

weblogic.security.SSL.
TrustManagerJSSE

このインタフェースを使うと、ユーザはピアの証明書チェーンでの何らかの検証エラーをオーバーライドし、ハンドシェークを継続できる。また、ピア証明書チェーンに対しさらに検証を実行し、必要に応じてハンドシェークを中断することもできる。

weblogic.security.SSL
SSLContext

このクラスは、このコンテキスト下で作成されたすべてのソケットで共有されるすべての状態情報を保持する。

weblogic.security.SSL.
SSLSocketFactory

このクラスは、SSL ソケットを作成するリクエストを、SSLSocketFactory に委託する。


 

SSL クライアント アプリケーション コンポーネント

SSL クライアント アプリケーションには、少なくとも以下のコンポーネントが含まれます。

ここで説明しているコンポーネントを実装する完全な実践的 SSL 認証クライアントについては、WebLogic Server で提供されている SAMPLES_HOME\server\examples\src\examples\security\sslclient ディレクトリの SSLClient サンプル アプリケーションを参照してください。

JSEE 認証の詳細については、Sun の『Java Secure Socket Extension (JSSE) 1.0.3 API User's Guide』(http://java.sun.com/products/jsse/doc/guide/API_users_guide.html) を参照してください。

 


SSL を使用するアプリケーションの記述

ここでは、以下のトピックについて説明します。

WebLogic Server 間の安全な通信

URL オブジェクトを使用すると、クライアントとして機能している WebLogic Server インスタンスから別の WebLogic Server インスタンスへの発信 SSL 接続を確立することができます。weblogic.net.http.HttpsURLConnection クラスを使用して、プライベート キーとデジタル証明書を含む、クライアントのセキュリティ コンテキスト情報を指定できます。

weblogic.net.http.HttpsURLConnection クラスは、ネゴシエーションされた暗号スイートの判別、ホスト名検証の取得と設定、サーバの証明書チェーンの取得、および新しい SSL ソケットを作成するための SSLSocketFactory の取得と設定を行うメソッドを提供します。

SSLClient のコード例では、weblogic.net.http.HttpsURLConnection クラスを使用して発信 SSL 接続を確立しています。SSLClient のコード例は、SAMPLES_HOME\server\examples\src\examples\security\sslclient ディレクトリの examples.security.sslclient パッケージにあります。

SSL クライアントの作成

ここでは、さまざまなタイプの SSL クライアントを作成する方法を、サンプルを示して説明します。以下のタイプの SSL クライアントについて説明します。

SSL クライアントのライセンス要件 : WebLogic SSL クラス (weblogic.security.SSL) を使用してエンタープライズ JavaBean (EJB) を呼び出すスタンドアロン Java クライアントはすべて、BEA ライセンス ファイルを使用する必要があります。クライアント アプリケーションを実行する際、コマンドラインで次のシステム プロパティを設定します。

license_file_directory は、BEA ライセンス ファイル (license.bea) が格納されているディレクトリを表します。以下に、ライセンス ファイルのデフォルトの場所 (c:\bea) を使用する実行コマンドの例を示します。

java -Dbea.home=c:\bea \
-Djava.protocol.handler.pkgs=com.certicom.net.ssl my_app

SSLClient サンプル

SSLClient サンプルでは、URL および URLConnection オブジェクトによって発信 SSL 接続を WebLogic SSL ライブラリを使用して確立する方法が示されています。スタンドアロンのアプリケーションからだけでなく、WebLogic Server 内のサーブレットからこの処理を行う方法も示されています。

注意 : 発信 SSL 接続を確立するとき、WebLogic Server インスタンスはそのサーバの証明書のインスタンスを使用します。同じまたは別の WebLogic Server インスタンスと双方向の SSL で通信するときは、着信側の WebLogic Server インスタンスにおいて、発信側サーバの証明書がクライアントのルート CA リストと照合されます。

コード リスト 4-2 はサンプルの SSLClient です。このコードは、SAMPLES_HOME\server\examples\src\examples\security\sslclient にある SSLClient.java ファイルからの抜粋です。

コード リスト 4-2SSL クライアントのサンプル コード

package examples.security.sslclient;

import java.io.File;
import java.net.URL;
import java.io.IOException;
import java.io.InputStream;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.util.Hashtable;
import java.security.Provider;
import javax.naming.NamingException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.servlet.ServletOutputStream;
import weblogic.net.http.*;
import weblogic.jndi.Environment;
/** SSLClient は、WebLogic の SSL ライブラリを使用して外部への SSL 接続を
* 行う方法を示す簡単なサンプル。これをスタンドアロンのアプリケーションから
* 行う場合と、WebLogic Server 内部 (サーブレット内) から行う場合の両方を
* 示す
*
* WebLogic Server では、外部への SSL 接続を行う際に
* そのサーバの証明書のインスタンスを使用することに
* 注意。双方向の SSL を使って、同じあるいは別の
* WebLogic Server と通信する場合、発信側サーバの証明書は、
* 受信側の WebLogic Server でクライアントのルート CA リスト
* に照らし合わせて検証される
*
* @author Copyright (c) 1999-2002 by BEA Systems, Inc. All Rights Reserved.
*/
public class SSLClient {
public void SSLClient() {}
public static void main (String [] argv)
throws IOException {
if ((!((argv.length == 4) || (argv.length == 5))) ||
(!(argv[0].equals("wls")))
) {
System.out.println("example: java SSLClient wls
server2.weblogic.com 80 443 /examplesWebApp/SnoopServlet.jsp");
System.exit(-1);
}
    try {
System.out.println("----");
if (argv.length == 5) {
if (argv[0].equals("wls"))
wlsURLConnect(argv[1], argv[2], argv[3], argv[4], System.out);
} else { // クエリが null の場合、デフォルト ページが返される
if (argv[0].equals("wls"))
wlsURLConnect(argv[1], argv[2], argv[3], null, System.out);
}
System.out.println("----");
} catch (Exception e) {
e.printStackTrace();
printSecurityProviders(System.out);
System.out.println("----");
}
}
private static void printOut(String outstr, OutputStream stream) {
if (stream instanceof PrintStream) {
((PrintStream)stream).print(outstr);
return;
} else if (stream instanceof ServletOutputStream) {
try {
((ServletOutputStream)stream).print(outstr);
return;
} catch (IOException ioe) {
System.out.println(" IOException: "+ioe.getMessage());
}
}
System.out.print(outstr);
}
private static void printSecurityProviders(OutputStream stream) {
StringBuffer outstr = new StringBuffer();
outstr.append(" JDK Protocol Handlers and Security Providers:\n");
outstr.append(" java.protocol.handler.pkgs - ");
outstr.append(System.getProperties().getProperty(
"java.protocol.handler.pkgs"));
outstr.append("\n");
Provider[] provs = java.security.Security.getProviders();
for (int i=0; i<provs.length; i++)
outstr.append(" provider[" + i + "] - " + provs[i].getName() +
" - " + provs[i].getInfo() + "\n");
outstr.append("\n");
printOut(outstr.toString(), stream);
}
private static void tryConnection(java.net.HttpURLConnection connection,
OutputStream stream)
throws IOException {
connection.connect();
String responseStr = "\t\t" +
connection.getResponseCode() + " -- " +
connection.getResponseMessage() + "\n\t\t" +
connection.getContent().getClass().getName() + "\n";
connection.disconnect();
printOut(responseStr, stream);
}
/*
   * このメソッドは、URL オブジェクトと URLConnection オブジェクト
   * を使って新しい SSL 接続を作成する方法 (WebLogic SSL クライアント
   * クラスを使用) の例を示す
*/
public static void wlsURLConnect(String host, String port,
String sport, String query,
OutputStream out) {
try {
if (query == null)
query = "/examplesWebApp/index.jsp";
      // 以下に示したプロトコル登録は、WebLogic の通常の起動シーケンスで
      // 処理される。ただし、これは、コンソールの SSL パネルを
      // 使って無効にできる
//
// ここでは、スタンドアロン Java アプリケーションにおける概念の実証として、
      // それを再現する。URL オブジェクトを使用した WebLogic 内部での新しい
      // 接続の作成は期待どおりに機能する
java.util.Properties p = System.getProperties();
String s = p.getProperty("java.protocol.handler.pkgs");
if (s == null) {
s = "weblogic.net";
} else if (s.indexOf("weblogic.net") == -1) {
s += "|weblogic.net";
}
p.put("java.protocol.handler.pkgs", s);
System.setProperties(p);
printSecurityProviders(out);
// プロトコル登録の終わり
printOut(" Trying a new HTTP connection using WLS client classes -
\n\thttp://" + host + ":" + port + query + "\n", out);
URL wlsUrl = null;
try {
wlsUrl = new URL("http", host, Integer.valueOf(port).intValue(), query);
weblogic.net.http.HttpURLConnection connection =
new weblogic.net.http.HttpURLConnection(wlsUrl);
tryConnection(connection, out);
} catch (Exception e) {
printOut(e.getMessage(), out);
e.printStackTrace();
printSecurityProviders(System.out);
System.out.println("----");
}
printOut(" Trying a new HTTPS connection using WLS client classes -
\n\thttps://" + host + ":" + sport + query + "\n", out);
wlsUrl = new URL("https", host, Integer.valueOf(sport).intValue(), query);
weblogic.net.http.HttpsURLConnection sconnection =
new weblogic.net.http.HttpsURLConnection(wlsUrl);
     // 双方向 SSL 接続をコンフィグレーションした場合のみ、すなわちサーバの [キーストア & SSL] タブの
// [詳細オプション] ペインにある [サーバ属性] の [相互クライアント認証の動作] フィールドで
     // [クライアント証明書を要求 (強制する)] が選択されている場合、
     // 以下のプライベート キーとクライアント証明書チェーンが
     // 使用される
     //
      File ClientKeyFile  = new File ("clientkey.pem");
File ClientCertsFile = new File ("client2certs.pem");
if (!ClientKeyFile.exists() || !ClientCertsFile.exists())
{
System.out.println("Error : clientkey.pem/client2certs.pem
is not present in this directory.");
System.out.println("To create it run - ant createmycerts.");
System.exit(0);
}
InputStream [] ins = new InputStream[2];
ins[0] = new FileInputStream("client2certs.pem");
ins[1] = new FileInputStream("clientkey.pem");
String pwd = "clientkey";
sconnection.loadLocalIdentity(ins[0], ins[1], pwd.toCharArray());
tryConnection(sconnection, out);
} catch (Exception ioe) {
printOut(ioe.getMessage(), out);
ioe.printStackTrace();
}
}
}

SSLSocketClient サンプル

SSLSocketClient サンプルでは、直接セキュア ポートから WebLogic Server のインスタンスによって提供される JSP に接続し、その接続の結果を表示する方法を示します。以下の機能を実装する方法が示されています。

コード リスト 4-3 はサンプルの SSLSocketClient です。このコードは、SAMPLES_HOME\server\examples\src\examples\security\sslclient にある SSLSocketClient.java ファイルからの抜粋です。

コード リスト 4-3SSLSocketClient サンプル コード

package examples.security.sslclient;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.FileInputStream;
import java.util.Hashtable;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.cert.Certificate;
import weblogic.security.SSL.HostnameVerifierJSSE;
import weblogic.security.SSL.SSLContext;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSession;
import weblogic.security.SSL.SSLSocketFactory;
import weblogic.security.SSL.TrustManagerJSSE;
  /**
* この Java クライアントでは、WebLogic Server から配信される JSP に
  * セキュア ポートを使って接続する方法を示し、接続の結果を表示する
*
* @author Copyright (c) 1999-2002 by BEA Systems, Inc. All Rights Reserved.
*/
public class SSLSocketClient {
public void SSLSocketClient() {}
public static void main (String [] argv)
throws IOException {
if ((argv.length < 2) || (argv.length > 3)) {
System.out.println("usage: java SSLSocketClient host sslport
<HostnameVerifierJSSE>");
System.out.println("example: java SSLSocketClient server2.weblogic.com 443
MyHVClassName");
System.exit(-1);
}
try {
System.out.println("\nhttps://" + argv[0] + ":" + argv[1]);
System.out.println(" Creating the SSLContext");
SSLContext sslCtx = SSLContext.getInstance("https");
      File KeyStoreFile  = new File ("mykeystore");
if (!KeyStoreFile.exists())
{
System.out.println("Keystore Error : mykeystore is not present in this
directory.");
System.out.println("To create it run - ant createmykeystore.");
System.exit(0);
}
      System.out.println(" Initializing the SSLContext with client\n" +
" identity (certificates and private key),\n" +
" HostnameVerifierJSSE, AND NulledTrustManager");
     // キーストアを開き、プライベート キーと証明書チェーンを取得する
      KeyStore ks = KeyStore.getInstance("jks");
ks.load(new FileInputStream("mykeystore"), null);
PrivateKey key = (PrivateKey)ks.getKey("mykey", "testkey".toCharArray());
Certificate [] certChain = ks.getCertificateChain("mykey");
sslCtx.loadLocalIdentity(certChain, key);
      HostnameVerifierJSSE hVerifier = null;
if (argv.length < 3)
hVerifier = new NulledHostnameVerifier();
else
hVerifier = (HostnameVerifierJSSE) Class.forName(argv[2]).newInstance();
sslCtx.setHostnameVerifierJSSE(hVerifier);
TrustManagerJSSE tManager = new NulledTrustManager();
sslCtx.setTrustManagerJSSE(tManager);
System.out.println(" Creating new SSLSocketFactory with SSLContext");
SSLSocketFactory sslSF = (SSLSocketFactory) sslCtx.getSocketFactoryJSSE();
System.out.println(" Creating and opening new SSLSocket with
SSLSocketFactory");
      // createSocket(String hostname, int port) を使用する
SSLSocket sslSock = (SSLSocket) sslSF.createSocket(argv[0],
new Integer(argv[1]).intValue());
System.out.println(" SSLSocket created");
sslSock.addHandshakeCompletedListener(new MyListener());
OutputStream out = sslSock.getOutputStream();
      // 簡単な HTTP リクエストを送信する
String req = "GET /examplesWebApp/ShowDate.jsp HTTP/1.0\r\n\r\n";
out.write(req.getBytes());
      // InputStream を取得し、HTTP 結果を読み込んで
      // コンソールに表示する
      InputStream in = sslSock.getInputStream();
byte buf[] = new byte[1024];
try
{
while (true)
{
int amt = in.read(buf);
if (amt == -1) break;
System.out.write(buf, 0, amt);
}
}
catch (IOException e)
{
return;
}
sslSock.close();
System.out.println(" SSLSocket closed");
} catch (Exception e) {
e.printStackTrace();
}
}
}

SSLClientServlet サンプル

SSLClientServlet サンプルは、SSLClient サンプルの簡単なサーブレット ラッパーです。

コード リスト 4-4 はサンプルの SSLSocketClient です。このコードは、SAMPLES_HOME\server\examples\src\examples\security\sslclient にある SSLSClientServlet.java ファイルからの抜粋です。

コード リスト 4-4SSLClientServlet サンプル コード

package examples.security.sslclient;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import javax.servlet.*;
import javax.servlet.http.*;
/**
* SSLClientServlet は、examples.security.sslclient.SSLClient の
 * 簡単なサーブレット ラッパーである
*
* @see SSLClient
* @author Copyright (c) 1999-2002 by BEA Systems, Inc. All Rights Reserved.
*/
public class SSLClientServlet extends HttpServlet {
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
response.setHeader("Pragma", "no-cache"); // HTTP 1.0
response.setHeader("Cache-Control", "no-cache"); // HTTP 1.1
ServletOutputStream out = response.getOutputStream();
    out.println("<br><h2>ssl client test</h2><br><hr>");
String[] target = request.getParameterValues("url");
try {
      out.println("<h3>wls ssl client classes</h3><br>");
out.println("java SSLClient wls localhost 7001 7002
/examplesWebApp/SnoopServlet.jsp<br>");
out.println("<pre>");
SSLClient.wlsURLConnect("localhost", "7001", "7002",
"/examplesWebApp/SnoopServlet.jsp", out);
out.println("</pre><br><hr><br>");
    } catch (IOException ioe) {
out.println("<br><pre> "+ioe.getMessage()+"</pre>");
ioe.printStackTrace();
}
}
}

双方向 SSL 認証の使用

証明書認証では、WebLogic Server は、リクエスト元のクライアントにデジタル証明書を送信します。クライアントは、デジタル証明書を調べて、本物かどうか、期限切れでないかどうか、認証元の WebLogic Server インスタンスに一致しているかどうかを確認します。

双方向 SSL 認証 (相互認証の一形態) を使用する場合は、リクエスト元のクライアントもデジタル証明書を WebLogic Server に提示します。双方向 SSL 認証をするよう WebLogic Server のインスタンスをコンフィグレーションすると、指定した認証局からデジタル証明書を送信するようにリクエスト元のクライアントに要求できるようになります。WebLogic Server では、指定した信頼性のある認証局のルート証明書によって署名されたデジタル証明書のみが受け付けられます。

双方向 SSL 認証をするための WebLogic Server のコンフィグレーション方法については、『WebLogic Security の管理』の「SSL のコンフィグレーション」を参照してください。

以降の節では、双方向 SSL 認証を WebLogic Server に実装するさまざまな方法について説明します。

JNDI を使用した双方向 SSL 認証

Java クライアントの双方向 SSL 認証で JNDI を使用する場合、WebLogic JNDI Environment クラスの setSSLClientCertificate() メソッドを使用します。このメソッドは、クライアント認証に対して、X.509 デジタル証明書のプライベート キーと証明書チェーンを設定します。

デジタル証明書を JNDI に渡すには、DER エンコードされたデジタル証明書を格納するファイルで開かれている InputStreams の配列を作成し、JNDI ハッシュ テーブルにその配列を設定します。配列内の最初の要素には、Java クライアントのプライベート キー ファイルで開かれている InputStream が格納されている必要があります。配列内の 2 番目の要素には、Java クライアントのデジタル証明書ファイルで開かれている InputStream が格納されている必要があります (このファイルには Java クライアントの公開鍵が含まれています)。追加要素として、ルート認証局のデジタル証明書、証明書チェーン内のデジタル証明書の署名者を格納できます。デジタル証明書が WebLogic Server キーストア ファイルの Java クライアントで登録された認証局によって直接発行されない場合、WebLogic Server は、証明書チェーンを使用して Java クライアントのそのデジタル証明書を認証できます。

weblogic.security.PEMInputStream クラスを使用すると、Privacy Enhanced Mail (PEM) ファイルに保存されているデジタル証明書を読み込むことができます。このクラスでは、ベース 64 でエンコードされた DER 認証を PEM ファイルにデコードするフィルタが提供されます。

コード リスト 4-5 は、Java クライアントで双方向 SSL 証明書認証を使用する方法を示しています。

コード リスト 4-5JNDI を使用する双方向 SSL 認証クライアントの例

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import weblogic.jndi.Environment;
import weblogic.security.PEMInputStream;
import java.io.InputStream;
import java.io.FileInputStream;
public class SSLJNDIClient 
{
public static void main(String[] args) throws Exception
{
Context context = null;
try {
Environment env = new Environment();
      // 接続パラメータを設定
      env.setProviderUrl("t3s://localhost:7002");
      // 次の 2 つの set メソッドは、UserNameMapper インタフェースを
      // 使用している場合は省略可能
      env.setSecurityPrincipal("system");
env.setSecurityCredentials("weblogic");
      InputStream key = new FileInputStream("certs/demokey.pem");
InputStream cert = new FileInputStream("certs/democert.pem");
      // key/cert が pem ファイル内にある場合は入力ストリームをラップ
      key = new PEMInputStream(key);
cert = new PEMInputStream(cert);
      env.setSSLClientCertificate(new InputStream[] { key, cert});
      env.setInitialContextFactory(Environment.
DEFAULT_INITIAL_CONTEXT_FACTORY);
context = env.getInitialContext();
      Object myEJB = (Object) context.lookup("myEJB");
}
finally {
if (context != null) context.close();
}
}
}

JNDI の getInitialContext() メソッドが呼び出されると、Java クライアントと WebLogic Server は、Web ブラウザが相互認証を実行してセキュリティ保護された Web サーバ接続を取得するのと同じ方法で相互認証を実行します。デジタル証明書を確認できない場合や Java クライアントのデジタル証明書をデフォルトの (アクティブな) セキュリティ レルムで認証できない場合、例外が送出されます。認証されたユーザ オブジェクトは Java クライアントのサーバ スレッドに格納され、保護された WebLogic リソースへの Java クライアントのアクセスを管理するパーミッションのチェックに使用されます。

WebLogic JNDI Environment クラスを使用する場合、getInitialContext() メソッドの呼び出しごとに新しい Environment オブジェクトを作成する必要があります。User オブジェクトとセキュリティ資格を一度指定すると、ユーザおよびユーザに関連する資格は Environment オブジェクトの設定に残ります。再設定を試みて JNDI getInitialContext() メソッドを呼び出した場合は、元のユーザと資格が使用されます。

Java クライアントによる双方向 SSL 認証を使用する場合、WebLogic Server は、クライアント JVM ごとにユニークな Java 仮想マシン (JVM) ID を取得し、Java クライアントと WebLogic Server の間の接続が切断されないようにします。処理がないために接続がタイムアウトになるまで、Java クライアントの JVM が実行されている間は接続が続行されます。Java クライアントが新しい SSL 接続を確実にネゴシエーションできる唯一の方法は、その JVM を停止して JVM の他のインスタンスを実行することです。

コード リスト 4-5 のコードでは、weblogic.security.providers.authentication.UserNameMapper インタフェースを実装する WebLogic ID アサーション プロバイダの呼び出しが生成されます。UserNameMapper インタフェースを実装するクラスは、デジタル証明書が有効な場合にユーザ オブジェクトを返します。WebLogic Server では、この認証されたユーザ オブジェクトは WebLogic Server 内の Java クライアントのスレッドに格納されます。格納されたユーザ オブジェクトは、以降の認可リクエストで、スレッドがデフォルトの (アクティブな) セキュリティ レルムで保護されている WebLogic リソースにアクセスする際に使用されます。

注意 : weblogic.security.providers.authentication.UserNameMapper インタフェースの実装は CLASSPATH に指定されている必要があります。

証明書ベースの認証を実行する ID アサーション プロバイダがコンフィグレーションされていない場合、SSL 接続の JVM で動作している Java クライアントは、新しい JNDI InitialContext を作成し、JNDI SECURITY_PRINCIPALSECURITY_CREDENTIALS プロパティで新しいユーザ名とパスワードを指定することで WebLogic Server ユーザの ID を変更できます。SSL 接続後に Java クライアントによって渡されたデジタル証明書は使用されません。新しい WebLogic Server ユーザは、最初のユーザのデジタル証明書でネゴシエーションした SSL 接続を使用し続けます。

証明書ベースの認証を実行する ID アサーション プロバイダがコンフィグレーションされている場合、WebLogic Server はデジタル証明書を Java クライアントから UserNameMapper インタフェースを実装するクラスへ渡し、UserNameMapper クラスがデジタル証明書を WebLogic Server ユーザ名にマップします。したがって、証明書ベースの ID アサーションを使用していて新しいユーザ ID を設定する場合、その ID は変更できません。この理由は、デジタル証明書は、Environment ごとに JVM からの最初の接続リクエストの時点でのみ処理されるからです。

警告 : 次のような制限があります。双方向 SSL と JNDI を使用している場合は、1 つのクライアント JVM から複数のユーザが同時に WebLogic Server にログインすることはできません。異なるスレッドで複数のログインが実行された場合、その結果は確認不能であり、片方のユーザのリクエストが別のユーザのログインで実行され、ユーザが別のユーザのデータにアクセスできるようになることも考えられます。WebLogic Server では、1 つのクライアント JVM からの証明書ベースの複数の同時ログインをサポートしていません。JNDI コンテキストとスレッドの詳細と、JNDI コンテキストの潜在的な問題を回避する方法については、『WebLogic JNDI プログラマーズ ガイド』の「JNDI コンテキストとスレッド」および「JNDI コンテキストの問題の回避方法」を参照してください。

ユーザ名マッパーを作成する

双方向 SSL を使用している場合、WebLogic Server は SSL 接続を確立するときに Web ブラウザまたは Java クライアントのデジタル証明書を確認します。ただし、デジタル証明書は Web ブラウザまたは Java クライアントを WebLogic Server セキュリティ レルムのユーザとしては認識しません。Web ブラウザまたは Java クライアントがセキュリティ ポリシーで保護された WebLogic Server リソースを要求すると、WebLogic Server は Web ブラウザまたは Java クライアントに ID を持つように要求します。このリクエストに対応するため、WebLogic ID アサーション プロバイダは、Web ブラウザまたは Java クライアントのデジタル証明書を WebLogic Server セキュリティ レルムのユーザにマップするユーザ名マッパーを、有効にできるようにします。ユーザ名マッパーは、weblogic.security.providers.authentication.UserNameMapper インタフェースの実装でなければなりません。

このリリースの WebLogic Server では、weblogic.security.providers.authentication.UserNameMapper インタフェースのデフォルト実装、DefaultUserNameMapperImpl を使用することも、独自の実装を開発することもできます。

WebLogic ID アサーション プロバイダは、以下の ID アサーション トークン タイプについて、UserNameMapper インタフェースの実装を呼び出すことができます。

その他のタイプの証明書をマップする場合、UserNameMapper インタフェースの独自の実装を記述する必要があります。

デジタル証明書をユーザ名にマップする UserNameMapper インタフェースを実装するには、次の処理を実行する UserNameMapper クラスを記述します。

  1. UserNameMapper 実装クラスをインスタンス化します。
  2. UserNameMapper インタフェース実装を作成します。
  3. mapCertificateToUserName() メソッドを使用して、クライアントから提示された証明書チェーンに基づいて証明書をユーザ名にマップします。
  4. 文字列属性タイプを対応する Attribute Value Assertion フィールド タイプにマップします。

WebLogic Server インスタンス間で双方向 SSL 認証を使用する

一方の WebLogic Server インスタンスがもう一方の WebLogic Server インスタンスのクライアントとして機能するサーバ間通信で双方向 SSL 認証を使用できます。サーバ間通信で双方向 SSL 認証を使用すると、一般的なクライアント/サーバ環境でない場合でも、信頼できる高度なセキュリティで保護した接続を利用することができます。

コード リスト 4-6 は、ある WebLogic Server インスタンスで動作するサーブレットから server2.weblogic.com という別の WebLogic Server インスタンスにセキュリティで保護された接続を確立する方法を示しています。

コード リスト 4-6他の WebLogic Server インスタンスへのセキュリティ保護された接続の確立

FileInputStream [] f = new FileInputStream[3]; 
f[0]= new FileInputStream("demokey.pem");
f[1]= new FileInputStream("democert.pem");
f[2]= new FileInputStream("ca.pem");
Environment e = new Environment ();
e.setProviderURL("t3s://server2.weblogic.com:443");
e.setSSLClientCertificate(f);
e.setSSLServerName("server2.weblogic.com");
e.setSSLRootCAFingerprints("ac45e2d1ce492252acc27ee5c345ef26");

e.setInitialContextFactory
("weblogic.jndi.WLInitialContextFactory");
Context ctx = new InitialContext(e.getProperties())

コード リス 4-6 で、WebLogic JNDI Environment クラスは以下のパラメータを格納するハッシュ テーブルを作成します。

注意 : JNDI コンテキストとスレッドの詳細と、JNDI コンテキストの潜在的な問題を回避する方法については、『WebLogic JNDI プログラマーズ ガイド』の「JNDI コンテキストとスレッド」および「JNDI コンテキストの問題の回避方法」を参照してください。

サーブレットで双方向 SSL 認証を使用する

Java クライアントをサーブレット (または他のサーバサイド Java クラス) で認証するには、クライアントがデジタル証明書を提供したかどうかをチェックする必要があります。提供した場合は、証明書が信頼できる認証局で発行されたかどうかをさらにチェックします。サーブレットの開発者には、Java クライアントが有効なデジタル証明書を持っているかどうかを尋ねる役割があります。WebLogic Servlet API でサーブレットを開発する場合、HTTPServletRequest オブジェクトの getAttribute() メソッドで SSL 接続に関する情報にアクセスする必要があります。

以下の属性が、WebLogic Server サーブレットでサポートされています。

デジタル証明書に定義されているユーザ情報にアクセスできます。javax.servlet.request.X509Certificate 属性を取得すると、情報は java.security.cert X509 証明書の配列になっています。配列をそれにキャストして証明書を調べるだけで済みます。

デジタル証明書には、以下のような情報が指定されています。

カスタム ホスト名検証の使い方

ホスト名検証を使用すると、SSL 接続先のホストが予定していた通信先、または許可された通信先であることを確認できます。ホスト名検証は、WebLogic クライアントまたは WebLogic Server インスタンスが別のアプリケーション サーバの SSL クライアントとして動作している場合に便利です。介在者の攻撃を防ぐのに役立ちます。

注意 : このリリースの WebLogic Server では、デモ用デジタル証明書はインストール時に生成されるので、WebLogic Server ソフトウェアがインストールされるシステムのホスト名を格納します。したがって、開発またはテスト目的でデモ用証明書を使用する場合は、ホスト名検証をオンのままにしておく必要があります。

WebLogic Server の SSL ハンドシェーク機能としてのデフォルトの動作は、SSL サーバのデジタル証明書の Subject's Distinguished Name (SubjectDN) にある共通名と、SSL 接続の開始に使用する SSL サーバのホスト名を比較することです。これらの名前が一致しない場合は SSL 接続が中断されます。

SSL 接続の中断は、サーバのホスト名をデジタル証明書と照らし合わせて有効性を検証する SSL クライアントによって実行されます。デフォルト以外の動作が必要な場合は、ホスト名検証を無効にするか、カスタム ホスト名検証を登録します。ホスト名検証を無効にすると、SSL 接続は介在者の攻撃に対して無防備な状態になります。

ホスト名検証は、以下の方法で無効にできます。

カスタム ホスト名検証を記述できます。weblogic.security.SSL.HostnameVerifierJSSE インタフェースではコールバック メカニズムが提供されるため、接続先のサーバ名がサーバのデジタル証明書の SubjectDN にあるサーバ名と一致しない場合を処理するためのポリシーを定義できます。

カスタム ホスト名検証を使用するには、weblogic.security.SSL.HostnameVerifierJSSE インタフェースを実装するクラスを作成し、サーバのセキュリティ ID に関する情報を取得するメソッドを定義します。

注意 : このインタフェースは新しいスタイルの証明書を受け取り、このリリースの WebLogic Server では非推奨の weblogic.security.SSL.HostnameVerifier インタフェースに代わるものです。

カスタム ホスト名検証を使用する前に、以下の方法で実装するクラスを指定する必要があります。

カスタム ホスト名検証の例 (コード リスト 4-7 参照) SAMPLES_HOME\server\examples\src\examples\security\sslclient ディレクトリに配置された SSLclient のコードにあります。このコード例には、比較のために常に true を返す NulledHostnameVerifier クラスが含まれています。このサンプルでは、WebLogic SSL クライアントは、サーバのホスト名とデジタル証明書の SubjectDN との比較に関係なく、どの SSL サーバにも接続できます。

コード リスト 4-7ホスト名検証のサンプル コード

package examples.security.sslclient;
/**
* HostnameVerifierJSSE にはコールバック メカニズムが用意されているため、
* 接続先ホストと証明書の SubjectDN から得られるサーバ名とが一致しなければ
* ならない場合の処理についてのポリシーを、このインタフェースの実装者が
* 指定できるようになっている
*
* これは、そのクラスの null 版で、重大な問題のない WebLogic SSL
* クライアント クラスを示す。たとえば、このサンプルでは、
* クライアント コードは「localhost」のサーバに接続するが、
* デモ用証明書の SubjectDN CommonName は「bea.com」なので、
* デフォルトの WebLogic HostnameVerifierJSSE がこれら 2 つの
* ホスト名に対して String.equals() を実行する
*
* @see HostnameVerifier#verify
* @author Copyright (c) 1999-2002 by BEA Systems, Inc. All Rights
* Reserved.
*/
public class NulledHostnameVerifier implements
weblogic.security.SSL.HostnameVerifierJSSE {
public boolean verify(String urlHostname, String certHostname) {
return true;
}
}

トラスト マネージャの使い方

weblogic.security.SSL.TrustManagerJSSE インタフェースを使用すると、ピアのデジタル証明書内での検証エラーをオーバーライドし、SSL ハンドシェークを継続できます。また、サーバのデジタル証明書チェーンで付加的な検証を実行することで、SSL ハンドシェークを中止することもできます。

注意 : このインタフェースは新しいスタイルの証明書を受け取り、このリリースの WebLogic Server では非推奨の weblogic.security.SSL.TrustManager インタフェースに代わるものです。

SSL クライアントが WebLogic Server のインスタンスに接続すると、サーバは認証のためにデジタル証明書チェーンをクライアントに提示します。提示されたチェーンに無効なデジタル証明書が含まれている場合もあります。SSL 仕様では、クライアントが無効な証明書を検出した場合、SSL 接続が中断されることになっています。しかし、Web ブラウザは、無効な証明書を無視するかどうかをユーザに確認し、証明書チェーン内の残りの証明書を使用して SSL サーバを認証できるかどうかを判別するため、チェーンの検証を継続します。TrustManagerJSSE インタフェースを使用すると、どのような場合に SSL 接続を継続するか (または中止するか) を制御でき、上記のような矛盾した動作をなくすことができます。トラスト マネージャを使用すると、SSL 接続を続行する前にカスタム検証を実行できます。たとえば、トラスト マネージャを使用して、特定の地域 (町、州、国など) のユーザやその他の特殊な属性を持つユーザだけが SSL 接続を介してアクセスを取得できるように指定することができます。

トラスト マネージャを作成するには、weblogic.security.SSL.TrustManagerJSSE インタフェースを使用します。このインタフェースには、証明書検証で使用する一連のエラー コードが含まれています。また、必要に応じて、ピア証明書での付加的な検証を実行したり、SSL ハンドシェークを中断したりできます。デジタル証明書の検証が済むと、weblogic.security.SSL.TrustManagerJSSE インタフェースがコールバック関数を使用して、デジタル証明書の検証結果をオーバーライドします。トラスト マネージャのインスタンスは、setTrustManagerJSSE() メソッドを使用して SSL コンテキストに関連付けることができます。

weblogic.security.SSL.TrustManagerJSSE インタフェースは、JSSE 仕様に準拠しています。トラスト マネージャはプログラムでのみ設定できます。その使用は、Administration Console やコマンドラインでは定義できません。

注意 : 実行する検証によっては、トラスト マネージャを使用するとパフォーマンスに影響します。

トラスト マネージャの例 (コード リスト 4-8参照) は、SAMPLES_HOME\server\examples\src\examples\security\sslclient ディレクトリに配置された SSLclient のコード例にあります。

コード リスト 4-8TrustManager のコード例

package examples.security.sslclient;

import weblogic.security.SSL.TrustManagerJSSE;
import javax.security.cert.X509Certificate;
public class NulledTrustManagerJSSE implements TrustManagerJSSE{
  public boolean certificateCallback(X509Certificate[] o, int validateErr) {
System.out.println(" --- Do Not Use In Production ---\n" + " By using this " +
"NulledTrustManager, the trust in the server's identity "+
"is completely lost.\n --------------------------------");
for (int i=0; i<o.length; i++)
System.out.println(" certificate " + i + " -- " + o[i].toString());
return true;
}
}

SSLSocketClient サンプルでは、上で示したカスタム トラスト マネージャを使用します。SSLSocketClient では、トラスト マネージャで SSLContext を使用して新しい SSL 接続を設定する方法が示されています。この例も、SAMPLES_HOME\server\examples\src\examples\security\sslclient ディレクトリにあります。

ハンドシェーク完了リスナの使い方

javax.net.ssl.HandshakeCompletedListener は、指定された SSL 接続に対する SSL プロトコル ハンドシェークの完了について SSL クライアントが通知を受け取る方法を定義します。また、指定された SSL 接続で行われる SSL ハンドシェークの回数を定義します。コード リス 4-9 は、HandshakeCompletedListener インタフェースのコード例です。この例も、SAMPLES_HOME\server\examples\src\examples\security\sslclient ディレクトリにあります。

コード リスト 4-9HandshakeCompletedListener のコード例

package examples.security.sslclient;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.FileInputStream;
import java.util.Hashtable;
import javax.net.ssl.HandshakeCompletedListener;
import javax.net.ssl.SSLSession;
  public class MyListener implements HandshakeCompletedListener
{
public void handshakeCompleted(javax.net.ssl.
HandshakeCompletedEvent event)
{
SSLSession session = event.getSession();
System.out.println("Handshake Completed with peer " +
session.getPeerHost());
System.out.println(" cipher: " + session.getCipherSuite());
javax.security.cert.X509Certificate[] certs = null;
try
{
certs = session.getPeerCertificateChain();
}
catch (javax.net.ssl.SSLPeerUnverifiedException puv)
{
certs = null;
}
if (certs != null)
{
System.out.println(" peer certificates:");
for (int z=0; z<certs.length; z++) System.out.
println("certs["+z+"]: " + certs[z]);
}
else
{
System.out.println("No peer certificates presented");
}
}
}

SSLContext の使い方

SSLContext クラスを使用すると、SSL をプログラムによってコンフィグレーションし、SSL セッション情報を保持できます。たとえば、SSLContext クラスが提供するソケット ファクトリによって作成されたすべてのソケットは、SSL コンテキストに関連付けられたハンドシェーク プロトコルを使用することによって、セッション ステートを統一することができます。各インスタンスは、認証の実行に必要なキー、証明書チェーン、および信頼性のあるルート認証局を使用してコンフィグレーションできます。このため、同じ SSL コンテキストで作成された他のソケットは、その後もセッションを場合に応じて再利用できます。詳細については、『WebLogic Security の管理』の「SSL セッションの動作」を参照してください。トラスト マネージャ クラスのインスタンスを SSL コンテキストと関連付けるには、weblogic.security.SSL.SSLContext.setTrustManagerJSSE() メソッドを使用します。

SSLContext は、プログラムでのみ設定できます。Administration Console やコマンドラインでは設定できません。SSLContext オブジェクトは、Java の new 式または SSLContext クラスの getInstance() メソッドで作成できます。getInstance() メソッドは静的で、指定されたセキュア ソケット プロトコルを実装する新しい SSLContext オブジェクトを生成します。SSLContext クラスの使用例は、SAMPLES_HOME\server\examples\src\examples\security\sslclient ディレクトリの SSLSocketClient のサンプルで提供されています。このサンプル (コード リスト  4-3) では、SSLContext を使って新しい SSL ソケットを作成する新しい SSL ソケット ファクトリを作成する方法が示されています。

コード リスト 4-10 は、getInstance()メソッドを使用したインスタンス化のサンプルです。

コード リスト 4-10SSLContext のコード例

import weblogic.security.SSL.SSLContext;
SSLcontext sslctx = SSLContext.getInstance ("https")

SSL サーバ ソケット ファクトリの使い方

SSLServerSocketFactory クラスのインスタンスは、SSL ソケットを作成して返します。このクラスは、javax.net.SocketFactory の拡張です。

コード リスト 4-11 は、このクラスのインスタンス化のサンプルです。コード リスト 4-3 は、SSLServerSocketFactory クラスを使用するコード例です。このコード例は、SAMPLES_HOME\server\examples\src\examples\security\sslclient にある SSLSocketClient.java ファイルからの抜粋です。

コード リスト 4-11SSLServerSocketFactory のコード例

import weblogic.security.SSL.SSLSocketFactory;
  SSLSocketFactory sslSF = (SSLSocketFactory) sslCtx.getSocketFactoryJSSE();

URL を使用した発信 SSL 接続

URL オブジェクトを使用すると、クライアントとして機能している WebLogic Server インスタンスから別の WebLogic Server インスタンスへの発信 SSL 接続を確立することができます。WebLogic Server は、発信 SSL 接続について一方向と双方向の SSL 認証を両方ともサポートしています。

一方向 SSL 認証の場合は、java.net.URLjava.net.URLConnection、および java.net.HTTPURLConnection クラスを使用して、URL オブジェクトを使用する発信 SSL 接続を確立します。コード リスト 4-12 は、HTTP および HTTPS の URL を両方ともサポートし、これらの Java クラスのみを使用する (つまり WebLogic クラスは不要) simpleURL クラスを示しています。 WebLogic Server で一方向 SSL 認証 (HTTPS) に simpleURL クラスを使用するための必要条件は、java.protocols.handler.pkgs のシステム プロパティで「weblogic.net」が定義されていることだけです。

注意 : コード リスト 4-12simpleURL サンプルは、デフォルトで信頼性とホスト名をチェックするため、このサンプルでは信頼されていてホスト名チェックを通過する本当の Web サーバにデフォルトで接続することが必要です。そうしない場合は、コマンドライン上で信頼性とホスト名チェックをオーバーライドする必要があります。

コード リスト 4-12Java クラスのみを使用する一方向 SSL 認証 URL 発信 SSL 接続クラス

import java.net.URL;
import java.net.URLConnection;
import java.net.HttpURLConnection;
import java.io.IOException;
public class simpleURL
{
public static void main (String [] argv)
{
if (argv.length != 1)
{
System.out.println("Please provide a URL to connect to");
System.exit(-1);
}
setupHandler();
connectToURL(argv[0]);
}
   private static void setupHandler()
{
java.util.Properties p = System.getProperties();
String s = p.getProperty("java.protocol.handler.pkgs");
if (s == null)
s = "weblogic.net";
else if (s.indexOf("weblogic.net") == -1)
s += "|weblogic.net";
p.put("java.protocol.handler.pkgs", s);
System.setProperties(p);
}
   private static void connectToURL(String theURLSpec)
{
try
{
URL theURL = new URL(theURLSpec);
URLConnection urlConnection = theURL.openConnection();
HttpURLConnection connection = null;
if (!(urlConnection instanceof HttpURLConnection))
{
System.out.println("The URL is not using HTTP/HTTPS: " +
theURLSpec);
return;
}
connection = (HttpURLConnection) urlConnection;
connection.connect();
String responseStr = "\t\t" +
connection.getResponseCode() + " -- " +
connection.getResponseMessage() + "\n\t\t" +
connection.getContent().getClass().getName() + "\n";
connection.disconnect();
System.out.println(responseStr);
}
catch (IOException ioe)
{
System.out.println("Failure processing URL: " + theURLSpec);
ioe.printStackTrace();
}
}
}

双方向 SSL 認証の場合は、weblogic.net.http.HttpsURLConnection クラスを使用して、プライベート キーとデジタル証明書を含む、クライアントのセキュリティ コンテキスト情報を指定できます。このクラスのインスタンスは、リモート オブジェクトに対する HTTPS 接続を表しています。

SSL クライアントのコード例 (コード リスト 4-13) には、WebLogic URL オブジェクトを使用して、発信 SSL 接続を確立する方法が示されています。コード リス 4-13 のコード例は、SAMPLES_HOME\server\examples\src\examples\security\sslclient SSLClient.javaファイルからの抜粋です。

コード リスト 4-13WebLogic 双方向 SSL 認証 URL 発信 SSL 接続のコード例

wlsUrl = new URL("https", host, Integer.valueOf(sport).intValue(),
query);
weblogic.net.http.HttpsURLConnection sconnection =
new weblogic.net.http.HttpsURLConnection(wlsUrl);
InputStream [] ins = new InputStream[2];
ins[0] = new FileInputStream("client2certs.pem");
ins[1] = new FileInputStream("clientkey.pem");
String pwd = "clientkey";
sconnection.loadLocalIdentity(ins[0], ins[1], pwd.toCharArray());

 


SSL クライアントのコード例

WebLogic Server ソフトウェアには、完全な実践的 SSL 認証サンプルが付属しています。そのサンプルは、SAMPLES_HOME\server\examples\src\examples\security\sslclient ディレクトリにあります。このサンプルの説明と、構築、コンフィグレーション、および実行の手順については、サンプル ディレクトリの package.html ファイルを参照してください。このコード例は、修正して再利用できます。

 

フッタのナビゲーションのスキップ  ページの先頭 前 次