Oracle Containers for J2EE
セキュリティ・ガイド
10g(10.1.3.4.0) B50832-01 |
|
OC4Jでは、次のようにSecure Sockets Layer(SSL)通信がサポートされます。
この章では、スタンドアロンのOC4Jのシナリオとともに、Oracle Application Server環境での2つのシナリオとして、OC4JをWebリスナーとするOPMN管理OC4Jと、Oracle HTTP ServerをWebリスナーとするOPMN管理OC4Jについて説明します。この章の内容は次のとおりです。
関連項目
この項では、SSL対応J2EE環境でHTTPクライアント・リクエストが開始された場合の、Oracleコンポーネントの役割について説明します。図15-1は、このような環境で動作するアプリケーションを示しています。
このプロセスの手順は次のとおりです。
mod_ossl
/Oracle HTTP Serverは、リクエストを受信し、WebApp A1アプリケーションがHTTPクライアントに対するSSLサーバー認証を要求しているかどうかを判別します。
jazn>
要素のjaas-mode
設定に応じて異なります。JAASモードの使用方法を、「JAASモードの概要」および「JAASモードの構成と使用」で確認してください。
次の手順では、OC4JでSSL通信に鍵と証明書を使用する方法について説明します。ここで説明するのはサーバー・レベルの手順で、一般に安全な通信を必要とするアプリケーションのデプロイ前、通常はOracle Application Serverインスタンスの初期設定時に実行します。
キーストアは、すべてのトラステッド・ユーザーの証明書など、アプリケーションで使用される証明書の格納に使用されることに注意してください。OC4Jなどのエンティティは、そのキーストアを介して第三者の認証や、第三者に対する自己認証を行うことができます。Oracle HTTP Serverには、これと同じ用途を持つWalletと呼ばれるものがあります。
Javaでは、キーストアはjava.security.KeyStore
インスタンスで、Sun社のJDKに付属のkeytool
ユーティリティを使用して作成および操作できます。このオブジェクトの基礎となっているのは、物理的にはファイルです。
Oracle Wallet Managerには、Oracle Walletのための機能があります。この機能は、キーストアのためのkeytool
の機能に相当します。
次に、OC4JとOracle HTTP Server間で証明書を使用するためのOC4Jでの手順を示します。
keytool
を使用して、秘密鍵、公開鍵および未署名の証明書を生成します。この情報は、新規または既存のキーストアに置くことができます。
独自の署名を次の手順で生成します。
または、認識されている認証局から次の手順で署名を取得します。
署名を要求して受け取るプロセスは、使用する認証局に応じて異なります。このプロセスはOracle Application Serverのスコープおよび制御の対象外のため、ここでは説明しません。詳細は、任意の認証局のWebサイトにアクセスしてください。(ブラウザには、信頼できる認証局のリストがあります。)たとえば、VeriSign社とThawte社のWebアドレスは次のとおりです。
http://www.verisign.com/ http://www.thawte.com/
OC4JとOracle HTTP Server間でSSL通信を行うには、Oracle HTTP Serverで必要に応じて次の手順を実行する必要があります。
keytool
ユーティリティのかわりに、WalletとOracle Wallet Managerを使用します。
OC4Jが自己署名された証明書を持っている(基本的にOracle HTTP ServerはOC4Jを信頼していない)場合:
keytool
を使用してOC4Jの証明書をエクスポートします。この手順により、Oracle HTTP Serverからアクセス可能なファイルに証明書が置かれます。
または、OC4Jが(Oracle HTTP Serverで信頼されていない)別のエンティティが署名した証明書を持っている場合:
(これは「クライアント認証の要求」でも説明しています。)
スタンドアロンOC4Jでは、HTTPSを使用して、クライアントとOC4Jの間で直接、SSL通信を行うことができます。この項では、これを行う方法について説明します。
次の手順に従います。
keytool
ユーティリティを使用し、RSAの秘密鍵/公開鍵のペアを指定してキーストアを作成します。この例では、RSA鍵ペア生成アルゴリズムを使用し、パスワードに123456
を指定してファイルmykeystore.jks
に属するキーストアを生成します。
% keytool -genkey -keyalg RSA -keystore mykeystore.jks -storepass 123456
このツールでは、各項目の意味は次のとおりです。
keystore
オプションでは、鍵が格納されるファイルの名前を設定します。
storepass
オプションでは、キーストアを保護するためのパスワードを設定します。コマンドラインでこのオプションを省略し、かわりにパスワードの入力が要求されるようにすることもできます。
keytool
により、次のように追加情報が要求されます。
What is your first and last name? [Unknown]: Test User What is the name of your organizational unit? [Unknown]: Support What is the name of your organization? [Unknown]: Oracle What is the name of your City or Locality? [Unknown]: Redwood Shores What is the name of your State or Province? [Unknown]: CA What is the two-letter country code for this unit? [Unknown]: US Is <CN=Test User, OU=Support, O=Oracle, L=Redwood Shores, ST=CA, C=US> correct? [no]: yes Enter key password for <mykey> (RETURN if same as keystore password):
キー・パスワードに対しては、常に[Enter
]キーを押します。OC4J 10.1.3.x実装では、キーストアのパスワードは、キー・エントリのパスワードと同じである必要があります。
mykeystore
ファイルは、現行ディレクトリに作成されます。鍵のデフォルトの別名はmykey
です。
secure-web-site.xml
ファイルがない場合は、ORACLE_HOME
/j2ee/home/config/secure-web-site.xml
(J2EEの規約上、この名前を使用)を作成します。最初にdefault-web-site.xml
から必要な内容をコピーすることもできます。通常、この内容には<web-site>
要素下の次のサブ要素が含まれます。
SSL構成には<ssl-config>
要素も必要です。これについては、この手順で後述します。
secure-web-site.xml
を更新します。
secure="true"
を追加し、port
を適切なポートに設定して、<web-site>
要素を更新します。(たとえば、port="4443"
のように設定します。デフォルトの443を使用するには、スーパーユーザーになる必要があります。)スタンドアロンOC4Jの場合は、デフォルトの設定であるHTTPプロトコルを使用します。(protocol="http"
設定とsecure="true"
を組み合せることで、HTTPSが使用されます。)
<web-site port="4443" secure="true" protocol="http" display-name="Default OracleAS Containers for J2EE Web Site" > ... </web-site>
(必要に応じて、display-name
設定も変更する必要があります。)
<web-site>
要素内に次を追加してキーストアとパスワードを定義します。
<ssl-config keystore="your_keystore" keystore-password="your_password" />
your_keystore
は、キーストアのパスです。絶対パスまたは(WebサイトのXMLファイルが置かれている)ORACLE_HOME
/j2ee/home/config
に対する相対パスを指定します。your_password
はキーストアのパスワードです。
secure-web-site.xml
に保存します。
次に例を示します。
<?xml version="1.0"?> <web-site display-name="OC4J 10g Secure Web Site" protocol="http" port="4443" secure="true"> <ssl-config keystore="./roadrunner.jks" keystore-password="welcome1" /> <default-web-app application="default" name="defaultWebApp" root="/" /> <web-app application="SSLDemos-Project1-WS" name="WebServices" load-on-startup="true" root="/SSLDemos-Project1-context-root" /> <access-log path="../log/default-web-access2.log" split="day" /> </web-site>
server.xml
がsecure-web-site.xml
ファイルを参照しているかどうかを確認します。
secure-web-site.xml
ファイルの追加を初期化します。ブラウザを使用してSSLポートでサイトにアクセスし、SSLポートをテストします。アクセスに成功すると、受け入れられる認証局の署名がないため、証明書を受け入れるかどうかを確認するプロンプトが表示されます。
完了すると、OC4JはあるポートでSSLリクエストをリスニングし、別のポートで非SSLリクエストをリスニングします。server.xml
構成ファイル内で適切な*-web-site.xml
の参照行をコメント解除すると、SSLリクエストまたは非SSLリクエストを無効にできます。
<web-site path="./secure-web-site.xml" /> - comment this to remove SSL <default-site path="./default-web-site.xml" /> - comment this to remove non-SSL
これらのWebサイトは、異なるポートを使用する必要があります。
前述のsecure-web-site.xml
構成手順に加えて、次のオプションの手順も必要に応じて実行します。
<ssl-config>
要素の属性であるneeds-client-auth
フラグを、次のようにtrueに設定することで、クライアント認証を必須に指定します。
<web-site ... secure="true" ... > ... <ssl-config keystore="path_and_file" keystore-password="pwd" needs-client-auth="true" /> </web-site>
この手順では、OC4Jが安全な通信を行うため、クライアント・エンティティをそのIDに応じて受け入れるか拒否するかを選択するモードを設定します。needs-client-auth
属性を設定すると、OC4Jは接続時にクライアント証明連鎖をリクエストします。クライアントのルート証明書が認識されると、クライアントは受け入れられます。
<ssl-config>
要素で指定するキーストアには、HTTPSを介してOC4Jへの接続の認可を受ける任意のクライアントの証明書が格納されている必要があります。
重要
スタンドアロンOC4J(Oracle HTTP Serverなし)でCLIENT-CERT認証モードを使用するには、 |
<web-app>
要素のshared
属性で、複数のバインディング(様々なWebサイトまたはポートおよびコンテキスト・ルート)を共有できるかどうかを指定します。サポートされる値はtrue
およびfalse
(デフォルト)です。 共有とは、セッション、サーブレット・インスタンスおよびコンテキスト値など、Webアプリケーションの構成要素すべてを共有することを意味します。通常このモードは、SSLが通信のすべてではなく一部で要求されている場合に、同じコンテキスト・パスのHTTPサイトとHTTPSサイトの間でWebアプリケーションを共有するために使用します。すべての情報ではなく重要な情報のみを暗号化することで、パフォーマンスが向上します。
HTTPS Webアプリケーションがsharedに設定されている場合は、セッションの追跡には、SSL証明書ではなくCookieが使用されます。SSL証明書は、追跡する各証明書の保存に50Kを使用して、セッションのタイムアウト前にメモリー不足の問題が発生する場合があるため、Cookieの方が利点があります。CookieはWebアプリケーションのセキュリティを低下させますが、一部のブラウザで正常にサポートされていない、SSLセッションのタイムアウトなどの問題を回避するためには必要になります。
shared="true"
を設定する場合は、Cookieドメインを設定します。クライアントが異なるポートを介してWebサーバーと対話する場合は、Cookieは各ポートが独立したWebサイトを示すものとみなします。HTTPに対して80、HTTPSに対して443の各デフォルト・ポートを使用する場合は、クライアントはこれらを同じWebサイトの異なる2つのポートとみなし、1つのCookieのみを作成します。ただし、デフォルト以外のポートを使用する場合は、クライアントはこれらのポートを同一のWebサイトの独立した構成要素とみなし、Cookieドメインを指定していない場合はポートごとにCookieを作成します。Cookieドメインは、DNSドメイン内の複数のサーバーに対するクライアントの通信を追跡します。HTTPおよびHTTPSを使用する共有環境に対してデフォルト以外のポートを使用する場合は、アプリケーションのorion-web.xml
ファイルの<session-tracking>
要素内で、cookie-domain
属性を設定します。cookie-domain
属性には、提供されているDNSドメイン名のうち、最低2つのコンポーネントを指定します。
<session-tracking cookie-domain=".oracle.com" />
HTTPClient
の設定とは異なります。)次の例のように、secure-web-site.xml
内の<ssl-config>
要素のcipher-suites
属性を指定します。
<ssl-config keystore="your_keystore" keystore-password="your_password" cipher-suites="SSL_RSA_WITH_RC4_128_SHA, SSL_RSA_WITH_RC4_128_MD5,..." />
これは、暗号スイートをカンマで区切ったリストです。この属性を省略すると、次のURLにある参考ドキュメントで「enabled by default」として指定されている一連の暗号スイートが使用されます。
http://java.sun.com/j2se/1.4.2/docs/guide/security/jsse/
JSSERefGuide.html例15-1 クライアント認証でのHTTPS通信
次の例では、クライアント認証でHTTPSによる安全な通信を実行できるWebサイトを構成しています。
<web-site display-name="OC4J Web Site" protocol="http" port="4443" secure="true" > <default-web-app application="default" name="defaultWebApp" /> <access-log path="../log/default-web-access.log" /> <ssl-config keystore="../keystore" keystore-password="welcome" needs-client-auth="true" /> </web-site>
太字の部分のみが、セキュリティ関連の記述です。スタンドアロンOC4JでのHTTP通信の場合、protocolの値は安全な通信を使用するかどうかにかかわらず、常にhttp
になります。protocolの値がhttp
でsecure="false"
の場合は、HTTPプロトコルを示し、http
でsecure="true"
の場合は、HTTPSプロトコルを示します。
needs-client-auth
フラグを指定すると、OC4Jは接続時にクライアント証明連鎖をリクエストします。OC4Jがクライアントのルート証明書を認識すると、クライアントは受け入れられます。
<ssl-config>
要素で指定するキーストアは、HTTPおよびSSLを介してOC4Jへの接続の認可を受ける任意のクライアントの証明書が格納されている必要があります。
OC4JがOPMNによって管理され、OC4J自体がWebリスナーとして使用される場合(つまりOracle HTTP Serverを使用しない場合)は、HTTPSを使用してクライアントとOC4J間のSSL通信がサポートされます(前述のスタンドアロンOC4Jのシナリオと同様)。HTTPSをサポートするには、OPMNも構成する必要があります。
この項では、このOPMN管理のシナリオでSSLを使用する方法について説明します。これは次の手順で行います。
Oracle HTTP Serverを使用しないOPMN管理環境において、SSLを使用できるようにOC4Jを構成する方法は、「スタンドアロンOC4JでのSSLの使用」で説明しているスタンドアロンOC4Jの構成方法とほぼ同じです。詳細はこの項を参照してください。
secure-web-site.xml
(規約上、この名前を使用)を作成します。(必要に応じて、default-web-site.xml
から内容をコピーします。)
secure-web-site.xml
を更新します。
<web-site>
要素にsecure="true"
を追加して、この要素を更新します。通常、OPMN管理環境では、port="0"
設定で指定されるように、OPMNに従ってポートが選択されます。protocol="http"
を使用します。(protocol="http"
設定とsecure="true"
を組み合せることで、HTTPSが使用されます。)
<web-site port="0" secure="true" protocol="http" display-name="Default OracleAS Containers for J2EE Web Site" > ... </web-site>
(必要に応じて、display-name
設定も変更する必要があります。)
<web-site>
の下に<ssl-config>
要素を追加し、keystore
とkeystore-password
属性を使用して、キーストアの場所とパスワードを定義します。
secure-web-site.xml
に保存します。
次に例を示します。
<web-site display-name="OC4J Web Site" protocol="http" port="0" secure="true" > <default-web-app application="default" name="defaultWebApp" root="/j2ee" /> <access-log path="../log/default-web-access.log" /> <ssl-config keystore="../keystore" keystore-password="welcome" /> </web-site>
server.xml
が、secure-web-site.xml
を参照しているかどうかを確認します。
secure-web-site.xml
を初期化します。
注意
needs-client-auth="true"
設定が必要です。関連情報は、「クライアント認証の要求」を参照してください。
Oracle HTTP Serverを使用しないOPMN管理環境のOC4JでSSLを使用するには、HTTPSをサポートするようにOPMNを構成する必要があります。ファイルORACLE_HOME
/opmn/conf/opmn.xml
を、次のように更新します。
OC4J
下で、セキュリティ・パラメータを構成します(Wallet情報)。
<ias-component id="OC4J"> ... <category id="security-parameters"> <data id="wallet-file" value="file:walletfile"/> <data id="wallet-password" value="pwd"/> </category> ... </ias-component>
OC4J
下で、Webサイトに対してHTTPSプロトコルを指定します。
<ias-component id="OC4J"> ... <port id="secure-web-site" range="12501-12600" protocol="https"/> ... </ias-component>
OC4JがOPMNによって管理され、かつOracle HTTP ServerがWebリスナーとして使用されるOracle Application Server環境では、OC4JがAJPS(セキュアなバージョンのApache JServ Protocol)を使用して、Oracle HTTP ServerとOC4J間のSSL通信をサポートします。この項では、このシナリオでSSLを使用する方法について説明します。これは次の手順で行います。
この項の最後に、サンプルの構成ファイルを示します。
Oracle Application Server環境において、SSLを使用できるようにOC4Jを構成する方法は、「スタンドアロンOC4JでのSSLの使用」で説明している、スタンドアロンOC4Jの構成方法とほぼ同じです。詳細はこの項を参照してください。
secure-web-site.xml
(規約上、この名前を使用)を作成します。必要に応じて、default-web-site.xml
から内容をコピーします。
secure-web-site.xml
を更新します。
<web-site>
要素にsecure="true"
を追加して、この要素を更新します。通常、Oracle Application Server環境では、自動的に追加されるport="0"
設定で指定されるように、OPMNに従ってポートが選択されます。また、Oracle Application Server環境のデフォルトの設定であるprotocol="ajp13"
を使用します。(protocol="ajp13"
設定とsecure="true"
を組み合せることで、AJPSが使用されます。)
<web-site port="0" secure="true" protocol="ajp13" display-name="Default OracleAS Containers for J2EE Web Site" > ... </web-site>
(必要に応じて、display-name
設定も変更する必要があります。)
<web-site>
の下に<ssl-config>
要素を追加し、keystore
とkeystore-password
属性を使用して、キーストアの場所とパスワードを定義します。
secure-web-site.xml
に保存します。
次に例を示します。
<web-site display-name="OC4J Web Site" protocol="ajp13" port="0" secure="true" > <default-web-app application="default" name="defaultWebApp" root="/j2ee" /> <access-log path="../log/default-web-access.log" /> <ssl-config keystore="../keystore" keystore-password="welcome" /> </web-site>
Oracle HTTP Serverを介する通信の場合、protocolの値は安全な通信を使用するかどうかにかかわらず、常にajp13
になります。protocolの値がajp13
でsecure="false"
の場合は、AJPプロトコルを示し、ajp13
でsecure="true"
の場合は、AJPSプロトコルを示します。
server.xml
が、secure-web-site.xml
を参照しているかどうかを確認します。
secure-web-site.xml
を初期化します。
注意
<ssl-config>
要素のneeds-client-auth
属性は、ブラウザからのSSL認証に関係しません。この認証は、クライアントとOracle HTTP Server間の取決めによって行われます。ただし、OC4JでOracle HTTP ServerからのSSL認証を必要とする場合は、この属性が関係します。関連情報は、「クライアント認証の要求」を参照してください。
この項では、AJP over SSLを使用する場合の次の状況について説明します。
OC4JとOracle HTTP Server間のAJPSを構成するには、次の手順を実行します。
keytool
ユーティリティを使用し、証明書をキーストアからエクスポートします。(前述の、OC4JのSSL用構成手順により、OC4Jにキーストアを作成済であるものとします。)
% keytool -export -file cert_file_name -keystore keystore_file_name \ -storepass=password
ここで、cert_file_name
は、生成される証明書の目的ファイル名、keystore_file_name
は、作成済のキーストアの名前です。コマンドラインでstorepass
を省略し、かわりにパスワードの入力が要求されるようにすることもできます。コマンドが成功すると、証明書ファイル名を確認するメッセージが表示されます。
mod_oc4j.conf
ファイル内のSSL設定が安全な通信に適した値に設定されていることを確認します。SSLを有効にし、手順1で作成したWalletへのパスを指定する必要があります(ここにWalletのパスワードを指定することは不要です)。
Oc4jEnableSSL on Oc4jSSLWalletFile wallet_path
wallet_path
値は、ファイル名を除くWalletへのディレクトリ・パスです。(Walletファイル名は判明済です。)
Oracle Application Server環境では、OPMNの構成手順も実行する必要があります。ファイルORACLE_HOME
/opmn/conf/opmn.xml
を、次のように更新します。
OC4J
下で、セキュリティ・パラメータを構成します(Wallet情報)。
<ias-component id="OC4J"> ... <category id="security-parameters"> <data id="wallet-file" value="file:walletfile"/> <data id="wallet-password" value="pwd"/> </category> ... </ias-component>
OC4J
下で、Webサイトに対してAJPSプロトコルを指定します。
<ias-component id="OC4J"> ... <port id="secure-web-site" range="12501-12600" protocol="ajps"/> ... </ias-component>
HTTP_Server
下で、SSLがデフォルトのssl-enabled
設定により有効になっているかどうかを確認します。(ssl-disabled
の設定では、SSLは無効になっています。)
<ias-component id="HTTP_Server"> ... <data id="start-mode" value="ssl-enabled"/> ... </ias-component>
この項では、先行する各項で説明した構成に関連したサンプルを示します。
secure-web-site.xml
ファイル内の<web-site>
要素のサンプルを示します。
<web-site port="0" protocol="ajp13" secure="true"> <default-web-app application="default" name="defaultWebApp" root="/j2ee" /> <web-app application="default" name="dms" root="/dmsoc4j" /> ... <ssl-config keystore="C:\demotest\j2eetest\tsrc\shiphome\sslfiles\KEYSTORE\keystore" keystore-password="welcome1"/> </web-site>
サンプルのmod_oc4j.conf
ファイルを示します。
<IfModule mod_oc4j.c> Oc4jEnableSSL on Oc4jSSLWalletFile C:\demotest\j2eetest\tsrc\shiphome\sslfiles\ssl.wlt\default Oc4jSSLWalletPassword welcome1 <Location /oc4j-service> SetHandler oc4j-service-handler Order deny,allow Deny from all Allow from localhost ani-pc.us.oracle.com ani-pc </Location> </IfModule>
opmn.xml
に含まれる、コンポーネントID OC4J
およびHTTP_Server
の構成のサンプルを示します。
<ias-component id="OC4J"> <process-type id="home" module-id="OC4J" status="enabled"> <module-data> <category id="start-parameters"> <data id="java-options" value="-Xrs -server -Djava.security.policy=$ORACLE_HOME/j2ee/home/config/java2.policy -Djava.awt.headless=true"/> </category> <category id="security-parameters"> <data id="wallet-file" value= "file:C:/demotest/j2eetest/tsrc/shiphome/sslfiles/ssl.wlt/default"/> <data id="wallet-password" value="welcome"/> </category> <category id="stop-parameters"> <data id="java-options" value= "-Djava.security.policy=$ORACLE_HOME/j2ee/home/config/java2.policy -Djava.awt.headless=true"/> </category> </module-data> <start timeout="600" retry="2"/> <stop timeout="120"/> <restart timeout="720" retry="2"/> <port id="secure-web-site" range="12501-12600" protocol="ajps"/> <port id="rmi" range="3201-3300"/> <port id="jms" range="3701-3800"/> <process-set id="default_island" numprocs="1"/> </process-type> </ias-component> <ias-component id="HTTP_Server"> <process-type id="HTTP_Server" module-id="OHS"> <module-data> <category id="start-parameters"> <data id="start-mode" value="ssl-enabled"/> </category> </module-data> <process-set id="HTTP_Server" numprocs="1"/> </process-type> </ias-component>
この項では、サーバーに対するクライアントのSSL認証について、特にOC4Jのneeds-client-auth
属性を使用するOC4Jクライアント認証モードに重点を置いて説明します。
ここで検討するシナリオは次のとおりです。
needs-client-auth
属性を含めたOC4J構成は無関係)
OC4Jは、クライアント認証モードをサポートします。このモードでは、OC4Jサーバーが、クライアントから(またはOracle Application Server環境ではOracle HTTP Serverから)のSSL認証を明示的に要求します。クライアントは、接続時にOC4Jからのリクエストに従って、デジタル証明書で自己認証する必要があります。
クライアントとOC4J間の認証を使用した安全な通信中に、次の機能が実行されます。
次の例のように、secure-web-site.xml
内の<ssl-config>
要素のneeds-client-auth
属性を通じてクライアント認証をリクエストし、次に示す手順を実行します。
<web-site ... secure="true" ... > ... <ssl-config keystore="path_and_file" keystore-password="pwd" needs-client-auth="true" /> </web-site>
OC4Jは、安全な通信のために、クライアント・エンティティをクライアントIDに従って受け入れるか拒否します。クライアントのルート証明書が認識されると、クライアントは受け入れられます。secure-web-site.xml
内の<ssl-config>
要素で指定するキーストアには、OC4Jへの接続の認可を受ける任意のクライアントの証明書が格納されている必要があります。
クライアントからの証明連鎖では、トラスト・ポイントはキーストア内の証明書と一致するとしてOC4Jで検出される最初の証明書です。この信頼関係は、次の3つの方法のいずれかで確立されます。
OC4Jでは、捏造された証明書を防ぐために、トラスト・ポイントを含む証明連鎖全体が有効かどうかが検証されます。
スタンドアロンOC4JまたはOracle HTTP Serverを使用しないOPMN管理OC4JでOC4J HTTPリスナーが使用される場合は、secure-web-site.xml
内の<ssl-config>
要素でneeds-client-auth="true"
を設定することにより、クライアント(エンドユーザー)からのSSL認証をリクエストできます。実際に、OC4JリスナーでCLIENT-CERT認証を使用するには、この設定が必要です。
証明書を使用するには、証明書をクライアント・ブラウザのセキュリティ領域に設定するか(クライアントがブラウザの場合)、HTTPS接続の開始時にクライアント証明書および証明連鎖をプログラムで提示します(Javaクライアントの場合)。
追加情報は、前項の「OC4Jクライアント認証モードの概要」を参照してください。
Oracle Application Server環境では、Oracle HTTP ServerがOC4Jに対するクライアントとして動作します。このモードでのクライアント認証の場合、Oracle HTTP Serverは独自の証明書を持ち、その証明書とルート証明書で終わる証明連鎖を送信して自己認証を行う必要があります。OC4Jは、クライアントに至る信頼の連鎖を確立するときに、指定のリストからルート証明書のみを受け入れるように構成できます。
このシナリオでは、「OC4Jクライアント認証モードの概要」での説明のために、Oracle HTTP Serverをクライアントとみなします。
Oracle HTTP ServerとOC4J間の安全な通信には、HTTPSのかわりにAJPS(セキュアなApache JServ Protocol)が使用されます。
Oracle Application Server環境でクライアント(エンドユーザー)からOracle HTTP Serverに対するSSL認証をリクエストする場合は、OC4Jが関係せず、その構成(needs-client-auth
属性を含む)も無関係です。これには、クライアントとOracle HTTP Server間の取決めが必要となります。Oracle HTTP ServerでのSSLの使用方法(クライアント認証を有効にするための構成のカスタマイズ方法も含む)の詳細は、『Oracle HTTP Server管理者ガイド』を参照してください。
クライアント・ブラウザのセキュリティ領域に証明書を設定するか(クライアントがブラウザの場合)、HTTPS接続の開始時にクライアント証明書および証明連鎖をプログラムで提示します(Javaクライアントの場合)。
この項では、いくつかの一般的なSSLエラーと、その原因および解決策について説明します。その後に、一般的なSSLのデバッグ方法について簡単に説明します。
SSL証明書の使用時には、次のエラーが発生する場合があります。
Keytool Error: java.security.cert.CertificateException: Unsupported encoding
原因: 後続の空白があります。これは、keytool
ユーティリティでは使用できません。
処置: 後続の空白をすべて削除します。それでもエラーが発生する場合は、証明書応答ファイルに新規の1行を追加します。
Keytool Error: KeyPairGenerator not available
原因: 旧バージョンのJDKからkeytool
ユーティリティを使用していると思われます。
処置: システムにある最新JDKのkeytool
ユーティリティを使用してください。最新JDKを使用していることを確認するには、このJDKのフルパスを指定します。
Keytool Error: Failed to establish chain from reply
原因: keytool
ユーティリティでは、キーストア内でルートCAの証明書が見つからないため、サーバーの鍵から信頼できるルート認証局への証明連鎖を構築できません。
処置: 次のコマンドを実行します。
% keytool -keystore mykeystore -import -alias cacert -file cacert.cer (keytool -keystore mykeystore -import -alias intercert -file inter.cer)
中間CAのkeytool
ユーティリティを使用する場合は、次のコマンドを実行します。
% keytool -keystore mykeystore -genkey -keyalg RSA -alias serverkey % keytool -keystore mykeystore -certreq -file my.host.com.csr
証明書署名要求(CSR)から証明書を取得して、次のコマンドを実行します。
% keytool -keystore mykeystore -import -file my.host.com.cer -alias serverkey
No available certificate corresponds to the SSL cipher suites that are enabled
原因: 証明書に誤りがあります。
処置: 問題を特定し、訂正します。
javax.net.debug
プロパティを使用して、Java Secure Socket Extension(JSSE)実装からSSL接続に関する詳細なデバッグ情報を表示できます。オプション・リストを取得するには、OC4Jを次のように起動します。
これには、ブラウザ・リクエスト・ヘッダー、サーバーHTTPヘッダー、サーバーHTTPボディ、コンテンツの長さ(暗号化の前後)およびSSLバージョンの表示が含まれます。
ORMI over SSL(ORMIS)は、OC4Jではデフォルトで無効になっています。これは、ORMISを使用する前にクライアントおよびサーバーのキーストアまたはOracle Walletを作成することが推奨されているためです。
この項では、スタンドアロン環境またはOracle Application Serverにおけるクラスタ環境のOC4Jで、ORMISを有効にする構成について説明します。この構成手順を実行すると、これまでormi:
プロトコルを使用していたすべてのケースで、ormis:
プロトコルを使用できるようになります。
この項の内容は次のとおりです。
ORMIS構成および関連するRMI構成では、各OC4Jインスタンス上のserver.xml
ファイルおよびrmi.xml
ファイルの更新が必要になります。この項の内容は次のとおりです。
OC4JインスタンスでORMISを有効にするには、最初に、OC4Jサーバー構成ファイルserver.xml
に、OC4J RMI構成ファイルrmi.xml
へのパスを指定する<rmi-config>
要素が含まれるかどうかを確認します。
rmi.xml
へのパスは次のように指定します。
<rmi-config path="rmi_path" />
server.xml
ファイルおよびrmi.xml
ファイルのどちらも、通常ORACLE_HOME
/j2ee/home/config
ディレクトリにあるため、rmi_path
の値は、通常./rmi.xml
になります。
ORMISを使用するには、次の手順に従い、各OC4Jインスタンス上のrmi.xml
にSSL構成を定義します。
<rmi-server>
要素のssl-port
属性を使用して、SSLリスナー・ポートを指定します。次に例を示します。
<rmi-server ... port="23791" ssl-port="23943"> ... </rmi-server>
(ここでは、ORMIリスナー・ポートの23791への設定も行われています。)
<rmi-server>
要素の下に<ssl-config>
サブ要素を追加します。これは、キーストア構成用であり、任意の値を指定でき、OC4J再起動時には(セキュアでないORMIリスナーに加えて)ORMISリスナーが起動されます。ORMISを有効にする方法には、次に説明するように2つあります。1つはキーストアおよびパスワードを使用する方法であり、もう1つは匿名暗号スイートを使用する方法です。次の例では、SSLポートを23943に設定し、Oracle Walletベースの証明書を使用するようにOC4Jを構成しています(同時にRMIログ・ファイルを指定しています)。
<rmi-server xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation= "http://xmlns.oracle.com/oracleas/schema/rmi-server-10_0.xsd" port="23791" ssl-port="23943"> <ssl-config keystore="/wallets/wallet-server-a/ewallet.p12" keystore-password="serverkey-a" /> ... <log> <file path="../log/rmi.log" /> </log> </rmi-server>
keystore
属性の値には、キーストアの場所(絶対パス、またはWebサイトのXMLファイルが置かれているORACLE_HOME
/j2ee/home/config
に対する相対パス)およびファイル名を指定します。
Oracle WalletのかわりにJavaキーストアを使用するには、<ssl-config>
要素を次の例のように構成します。
<ssl-config keystore="/keystores/keystore_a.jks" keystore-password="serverkey-a"/>
キーストアおよびパスワードを使用する場合、サーバーのキーストアには、ORMISを介してOC4Jへの接続認可を受ける任意のクライアントの署名済証明書、またはクライアントのルートCA発行の証明書が格納されている必要があります。
ORMISを有効にするには、匿名暗号スイートも使用できます。この場合、<ssl-config>
要素から、keystore
およびkeystore-password
属性を削除します。
<ssl-config />
このモードでは、任意のORMISクライアントが、証明書のチェックなしでサーバーに接続できます。
スタンドアロンOC4Jでは、ORMISを有効にした場合はORMIを無効にできます。これを行うには、ORMIポートを-1に設定します。
<rmi-server ... port="-1" ssl-port="23943"> <ssl-config keystore="keystore" keystore-password="password" /> ... </rmi-server>
この構成を使用すると、OC4Jの再起動時に、セキュアでないORMIリスナーが無効になります。
OPMNによって管理されるクラスタOracle Application Server環境でORMISを有効にするには、次の手順を実行します。
rmi.xml
の<rmi-server>
要素にssl-port
を設定する手順は実行しません。これはOPMN管理環境では不要です。OPMN管理RMISポートが、rmi.xml
のssl-port
属性を物理的にオーバーライドしてしまうためです。
opmn.xml
ファイルにおいて、クラスタに属するOracle Application Serverインスタンスごとに、<port>
要素を次のようにrmis
のポート範囲付きで追加します。
<ias-component id="OC4J"> <process-type id="home" module-id="OC4J" status="enabled"> <module-data> <category id="start-parameters"> <data id="java-options" value="-server -Djava.security.policy=$ORACLE_HOME/j2ee/home/config/java2.policy -Djava.awt.headless=true -Dhttp.webdir.enable=false"/> </category> <category id="stop-parameters"> <data id="java-options" value= "-Djava.security.policy=$ORACLE_HOME/j2ee/home/config/java2.policy -Djava.awt.headless=true -Dhttp.webdir.enable=false"/> </category> </module-data> <start timeout="600" retry="2"/> <stop timeout="120"/> <restart timeout="720" retry="2"/> <port id="default-web-site" range="12501-12600" protocol="ajp"/> <port id="rmi" range="12401-12500"/> <port id="rmis" range="12701-12800"/> <port id="jms" range="12601-12700"/> <process-set id="default_group" numprocs="1"/> </process-type> ... </ias-component>
ORMISは、ORMIと同様に、アクセス制御リスト(ACL)マスクを設定することで、受信IPアクセスを制限する機能をサポートします。この設定はrmi.xml
内の<access-mask>
要素、およびそのサブ要素である<host-access>
と<ip-access>
を介して行います。
アクセス制御には、除外型と包含型があります。
<access-mask>
でmode="deny"
を使用してから、<host-access>
サブ要素か<ip-access>
サブ要素(またはこの両方)でmode="allow"
を使用することで、アクセスを許可する特定のホストまたはIPアドレスを指定します。
<access-mask>
でmode="allow"
を使用してから、<host-access>
サブ要素か<ip-access>
サブ要素(またはこの両方)でmode="deny"
を使用することで、アクセスを拒否する特定のホストまたはIPアドレスを指定します。
次の例では、除外モードを構成して、localhost
および192.168.1.0
へのアクセスのみを許可しています。(255.255.255.0
は適用されるサブネット・マスクです。)
<rmi-server xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation= "http://xmlns.oracle.com/oracleas/schema/rmi-server-10_0.xsd" port="23791" ssl-port="23943"> <ssl-config keystore="../wallets/wallet-server-a/ewallet.p12" keystore-password="serverkey-a" /> <access-mask default="deny"> <host-access domain="localhost" mode="allow"/> <ip-access ip="192.168.1.0" netmask="255.255.255.0" mode="allow"/> </access-mask> ... </rmi-server>
この項では、ORMISを使用するためのクライアント・サイドの構成について説明します。この項の内容は次のとおりです。
スタンドアロンOC4J環境のアプリケーションの場合は、システムおよびアプリケーションのURIを定義するjava.naming.provider.url
環境プロパティの設定に、ormis
プロトコルを指定します。
java.naming.provider.url=ormis://hostname/appname
Oracle Application Server(OPMN管理)環境のアプリケーションの場合は、opmn:ormis
プロトコルを指定します。
java.naming.provider.url=opmn:ormis://hostname/appname
EJB over ORMISをコールするには、クライアント・サイドで次の指定(必要なもののみ)を行う必要があります。
これらの設定は3箇所で指定できます。優先度の高い順に記述します。
-Djavax.net.ssl.keyStore=keystore_path -Djavax.net.ssl.keyStorePassword=keystore_password
jndi.properties
のプロパティとして指定(JSSEプロパティ設定が指定されている場合は無視されます。)
oc4j.[rmi.]keyStoreLoc=keystore_path oc4j.[rmi.]keyStorePass=keystore_password
ejb_sec.properties
のプロパティとして指定(JSSEプロパティ設定またはjndi.properties
プロパティ設定が指定されている場合は無視されます。)
oc4j.[rmi.]keyStoreLoc=keystore_path oc4j.[rmi.]keyStorePass=keystore_password
『Oracle Containers for J2EEサービス・ガイド』のRMIに関する章では、HTTPを介したORMIトンネリングの構成方法が説明されています。
SSL機能を使用するために、HTTPSを介したORMIトンネリングを構成することも可能です。基本的な手順は次のとおりです。
スタンドアロンOC4Jの場合は、ここでキーストアを作成し、secure-web-site.xml
ファイルを構成します。
Oracle Application Server環境の場合は、ここでキーストアを作成してsecure-web-site.xml
ファイルを構成し(記載されているように、スタンドアロンOC4Jと比べて一部異なっています)、必要に応じてAJP over SSLを構成し、さらにHTTPを有効にしてSSLを使用するようにOPMNを構成します。Oracle HTTP Serverでは、SSLがデフォルトで有効になることに注意してください。
java.naming.provider.url
環境プロパティの設定でormi:https
プロトコルを指定します。
java.naming.provider.url=ormi:https://hostname:https_port/appname
スタンドアロンOC4Jの場合は、secure-web-site.xml
で指定されているようにhttps_port
を指定します。「スタンドアロンOC4JでのSSLの使用」を参照してください。Oracle Application Server環境では、https_port
にOracle HTTP Server SSLポートを指定します。
次のクライアント・コードSnippetでは、ormi:https
プロトコルが指定されたURLが使用されています。
private static Context getInitialContext() throws NamingException { Hashtable env = new Hashtable(); env.put( Context.INITIAL_CONTEXT_FACTORY, "oracle.j2ee.naming.ApplicationClientInitialContextFactory" ); env.put( Context.SECURITY_PRINCIPAL, "oc4jadmin" ); env.put( Context.SECURITY_CREDENTIALS, "welcome1" ); env.put(Context.PROVIDER_URL, "ormi:https://localhost:443/apache-ejb"); env.put("oc4j.keyStoreLoc", "C:/product/iasSOA0622/Apache/Apache/conf/ssl.wlt/default/ewallet.p12"); env.put("oc4j.keyStorePass", "welcome"); return new InitialContext( env ); }
|
Copyright © 2003, 2008 Oracle Corporation. All Rights Reserved. |
|