BEA ホーム | 製品 | dev2dev | support | askBEA
 ドキュメントのダウンロード   サイト マップ   Glossary 
検索

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

 Previous Next Contents Index PDF で侮ヲ  

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 に HTTP ポートを使用します。このポートで使用できるのは 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-1 JNDI を使用する一方向 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/j2ee/sdk_1.3/techdocs/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 が一致しなければならない場合を扱うポリシーをこのインタフェースの実装側で指定できるように、コールバック メカニズムを提供する。

サーバで使用するこのインタフェースのインスタンスを指定するには、Administration Console の [Server Configuration] の [SSL] タブの [SSL.HostName Verifier] フィールドを、このインタフェースを実装するクラスの名前に設定する。

weblogic.security.SSL.
TrustManagerJSSE

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

weblogic.security.SSL.
SSLContext

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

weblogic.security.SSL.
SSLSocketFactory

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


 

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

最少でも、SSL クライアント アプリケーションは、以下のコンポーネントで構成されています。

ここで説明しているコンポーネントを実装する完全な実践的 SSL 認証クライアントについては、WebLogic Server で提供されている SAMPLES_HOME¥server¥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¥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¥src¥examples¥security¥sslclient にある SSLClient.java ファイルからの抜粋です。

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

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 内部 (サーブレット内) から行う場合の両方を
* 示す
*
* 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] タブでサーバに
// ClientCertificateEnforced が選択されている場合にのみ、
// 以下のプライベート キーとクライアント証明書チェーンが使用される
      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¥src¥examples¥security¥sslclient にある SSLSocketClient.java ファイルからの抜粋です。

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

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 はサンプルの SSLClientServlet です。このコードは、SAMPLES_HOME¥server¥src¥examples¥security¥sslclient にある SSLSClientServlet.java ファイルからの抜粋です。

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

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-5 JNDI を使用する双方向 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 インタフェースを実装する 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 クライアントにユーザ名とパスワードを指定するように要求します。 この要求を処理するために、WebLogic ID アサーション プロバイダでは、Web ブラウザまたは Java クライアントのデジタル証明書を WebLogic Server セキュリティ レルム内のユーザにマップするユーザ名マッパーを使用できます。 ユーザ名マッパーは、weblogic.security.providers.authentication.UserNameMapper インタフェースの実装でなければなりません。

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 X.509 証明書の配列になっています。配列をそれにキャストして証明書を調べるだけで済みます。

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

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

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

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

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

注意: ホスト名検証は、WebLogic Server に付属のデモ用デジタル証明書を使用しているときに無効にします。

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

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

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

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

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

カスタム ホスト名検証の例 (リスト4-7) については、SAMPLES_HOME¥server¥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¥src¥examples¥security¥sslclient ディレクトリの SSLClient のコード例を参照してください。

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

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 では、トラスト マネージャで SSL コンテキストを使用して新しい SSL 接続を設定する方法が示されています。 この例は、SAMPLES_HOME¥server¥src¥examples¥security¥sslclient ディレクトリにもあります。

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

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

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

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¥src¥examples¥security¥sslclient ディレクトリの SSLSocketClient サンプルを参照してください。このサンプル (リスト4-3) では、SSLContext を使って新しい SSL ソケットを作成する新しい SSL ソケット ファクトリを作成する方法が示されています。

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

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

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

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

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

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

コード リスト 4-11 SSLServerSocketFactory のコード サンプル

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-12 Java クラスのみを使用する一方向 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¥src¥examples¥security¥sslclient ディレクトリの SSLClient.java ファイルからの抜粋です。

コード リスト 4-13 WebLogic 双方向 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¥src¥examples¥security¥sslclient ディレクトリに置かれています。このサンプルの説明と、構築、コンフィグレーション、および実行の手順については、サンプル ディレクトリの package.html ファイルを参照してください。このコード例は、修正して再利用できます。

 

Back to Top Previous Next