注意:
|
Oracle Tuxedo CORBA JavaクライアントとOracle Tuxedo CORBA JavaクライアントORBはTuxedo 8.1で非推奨になり、サポートされなくなりました。すべてのOracle Tuxedo CORBA JavaクライアントおよびOracle Tuxedo CORBA JavaクライアントORBのテキスト・リファレンスとコード・サンプルは、サード・パーティ製のJava ORBライブラリを実装または実行する際の参考や、プログラマの参照用としてのみ使用してください。
|
サード・パーティのCORBA Java ORBのテクニカル・サポートは、各ベンダーによって提供されます。Oracle Tuxedoでは、サード・パーティのCORBA Java ORBに関する技術的なサポートまたはドキュメントは提供していません。
注意:
|
このメカニズムは、Oracle CORBAクライアント・アプリケーションで使用します。
|
Oracle Tuxedo CORBA環境のBootstrapオブジェクトは機能拡張されており、指定したIIOPリスナー/ハンドラに対するすべての通信を保護するように指定できます。Bootstrapオブジェクトは、IIOPリスナー/ハンドラの場所を指定する際に使用する
corbalocおよび
corbalocsのURL (Uniform Resource Locator)アドレス形式をサポートしています。提供されるセキュリティのタイプは、IIOPリスナー/ハンドラの場所の指定に使用するURLの形式によって異なります。
ホストとポートのアドレス形式の場合、URLアドレス形式を使用してIIOPリスナー/ハンドラの場所を指定しますが、ブートストラップ処理プロセスの動作は異なります。
corbalocまたは
corbalocs URLアドレス形式を使用する場合、IIOPリスナー/ハンドラへの初期接続は、次のいずれかに分かれます。
•
|
プリンシパルは、 Tobj::PrincipalAuthenticator::logonメソッドまたは SecurityLevel2::PrincipalAuthenticator::authenticateメソッドのいずれかによるパスワード認証を使用します。
|
•
|
プリンシパルは、SecurityCurrent以外のオブジェクトID値を使用して Tobj_Bootstrap::resolve_initial_referencesメソッドを呼び出します。
|
corbalocs URLアドレス形式を使用すると、最低限、プリンシパルとIIOPリスナー/ハンドラの間の接続の整合性を保護するためにSSLプロトコルが使用されます。
表10-1に、2つのURLアドレス形式の違いを示します。
表10-1
corbalocおよびcorbalocs URLアドレス形式の違い
|
|
|
デフォルトでは、IIOPリスナー/ハンドラに対する呼出しは保護されません。オプションで、IIOPリスナー/ハンドラに対してSSLプロトコルを構成します。
プリンシパルは、 SecurityLevel2::PrincipalAuthenticatorインタフェースの authenticate()メソッドおよび SecurityLeve12::Credentialsインタフェースの invocation_options_required()メソッドを使用し、証明書による認証を使用するように指定してブートストラップ処理をセキュリティ保護します。
|
|
IIOPリスナー/ハンドラに対する呼出しが保護され、IIOPリスナー/ハンドラまたはCORBA C++ ORBは、SSLプロトコルの使用を有効にするように構成する必要があります。詳細は、 6-1ページの「SSLプロトコルの構成」を参照してください。
|
corbalocおよび
corbalocs URLアドレス形式は、TCP/IPとドメイン・ネーム・システム(DNS)の両方の環境で簡単に操作できる文字列化されたオブジェクト参照を提供します。
corbalocおよび
corbalocs URLアドレス形式には、DNSスタイルのホスト名またはIPアドレスおよびポートが含まれます。
URLアドレス形式は、Interoperable Naming Serviceの一部としてObject Management Group (OMG)によって適用されたオブジェクトURLの定義に基づいて、その定義を拡張します。Oracle Tuxedoソフトウェアは、WebLogic Enterprise製品の旧リリースの機能をサポートすることに加えて、セキュリティ保護されたHTTPのURLに従ってモデル化された安全な形式をサポートするために、OMG Interoperable Naming Serviceで記述されたURL形式も拡張します。
リスト10-1
corbalocおよびcorbalocs URLアドレス形式の例
corbaloc://555xyz.com:1024,corbaloc://555backup.com:1022,
corbaloc://555last.com:1999
corbalocs://555xyz.com:1024,(corbalocs://555backup.com:1022|corbalocs://555last.com:1999)
corbaloc://555xyz.com:1111
corbalocs://24.128.122.32:1011, corbalocs://24.128.122.34
Oracle Tuxedo製品は、異なるスキームの複数のURLの列挙をサポートする構文を拡張し、OMG Interoperable Naming Serviceで記述したURL構文の機能を向上しています。
リスト10-2に、複数のURLを指定する例を示します。
リスト10-2
複数のURLアドレス形式の指定の例
corba
locs://555xyz.com:1024,corbaloc://555xyz.com:1111
corbalocs://ctxobj.com:3434,corbalocs://mthd.com:3434,corbaloc://force.com:1111
リスト10-2の例では、パーサーは、URL
corbaloc://force.com:1111に達すると、安全な接続を試行しなかったものとして内部状態をリセットし、保護されていない接続を試行します。これは、クライアント・アプリケーションがCredentialオブジェクトでSSLパラメータを設定していない場合に起こります。
次の項では、Bootstrapオブジェクトの異なるアドレス形式を使用した場合の動作を説明します。
CORBAクライアント・アプリケーションが、Bootstrapオブジェクトのホストとポートのアドレス形式を使用する場合、Bootstrapオブジェクトのコンストラクタ・メソッドは、指定したホスト名およびポート番号を基にオブジェクト参照を作成します。IIOPリスナー/ハンドラに対する呼出しは、SSLプロトコルによる保護なしに行われます。
クライアント・アプリケーションは、パスワード認証による認証も実行できます。ただし、ブートストラップ処理は非保護および非検証リンクで実行されるので、すべての通信は、次のセキュリティ攻撃に対して脆弱です。
•
|
中間者攻撃。接続が実行されたプリンシパルが望ましいプリンシパルかどうかを検証できないという理由によります。
|
•
|
サービス拒否攻撃。オブジェクト参照が返されない、返されたオブジェクト参照が無効、またはセキュリティ・トークンが無効という理由によります。
|
•
|
スニッファ攻撃。情報を自由に送信できるので、パケット・スニッファを持つユーザーが、暗号化されていない(たとえば、ユーザー名/パスワード情報のみが暗号化されている)メッセージの内容を見ることができるという理由によります。
|
•
|
改ざん攻撃。情報の整合性が保護されないという理由によります。メッセージの内容が変更されても、その変更は検出されません。
|
•
|
リプレイ攻撃。同じリクエストが繰り返し送信されても、それが検出されないという理由によります。
|
注意:
|
IIOPリスナー/ハンドラがSSLプロトコル用に構成され、Bootstrapオブジェクトのホストとポートのアドレス形式が使用されている場合、指定したCORBAオブジェクトに対する呼出しによって INVALID_DOMAIN例外が発生します。
|
デフォルトでは、
corbaloc URLアドレス形式およびパスワード認証を使用する場合に、IIOPリスナー/ハンドラに対する呼出しは保護されていません。したがって、すべての通信は、次のセキュリティ攻撃に対して脆弱です。
•
|
中間者攻撃。接続が実行されたプリンシパルが望ましいプリンシパルかどうかを検証できないという理由によります。
|
•
|
サービス拒否攻撃。オブジェクト参照が返されない、返されたオブジェクト参照が無効、またはセキュリティ・トークンが無効という理由によります。
|
•
|
スニッファ攻撃。情報を自由に送信できるので、パケット・スニッファを持つユーザーが、暗号化されていない(たとえば、ユーザー名/パスワード情報のみが暗号化されている)メッセージの内容を見ることができるという理由によります。
|
•
|
改ざん攻撃。情報の整合性が保護されないという理由によります。メッセージの内容が変更されても、その変更は検出されません。
|
•
|
リプレイ攻撃。同じリクエストが繰り返し送信されても、それが検出されないという理由によります。
|
corbaloc URLアドレス形式を使用する際に、
SecurityLevel2::PrincipalAuthenticator::authenticate()メソッドを使用して、証明書による認証を使用するように指定し、Credentialsオブジェクトの
invocation_methods_requiredメソッドを呼び出して、ブートストラップ処理を保護できます。
注意:
|
IIOPリスナー/ハンドラがSSLプロトコル用に構成されているものの、証明書による認証用に構成されておらず、 corbaloc URLアドレス形式が使用されている場合、指定したCORBAオブジェクトに対する呼出しによって INVALID_DOMAIN例外が発生します。
|
既存のCORBAアプリケーションを、ホストとポートのアドレス形式ではなく
corbaloc URL形式に移行することをお薦めします。
corbalocs URLアドレス形式は、プリンシパルとIIOPリスナー/ハンドラの間の通信を保護する場合に推奨される形式です。
corbalocs URLアドレス形式は、
corbaloc URLアドレス形式とほぼ同じように機能しますが、使用する認証のタイプに関係なく、IIOPリスナー/ハンドラまたはCORBA C++ ORBを使用した通信を保護するためにSSLプロトコルを使用する点が異なります。
デフォルトを
corbalocs URLアドレス形式で使用する場合、通信は、サービス拒否攻撃に対してのみ脆弱です。SSLプロトコルおよび証明書による認証を使用すると、スニッファ、改ざん、リプレイ攻撃を防ぐことができます。さらに、デジタル証明書で指定したホストの検証によって、中間者攻撃も防ぐことができます。
corbalocs URLアドレス形式を使用するには、SSLプロトコルの使用を有効にするようにIIOPリスナー/ハンドラまたはCORBA C++ ORBを構成する必要があります。IIOPリスナー/ハンドラまたはCORBA C++ ORBをSSLプロトコル用に構成する際の詳細は、
6-1ページの「SSLプロトコルの構成」を参照してください。
ここでは、CORBAアプリケーションでのパスワード認証の実装について説明します。
Securityサンプル・アプリケーションでは、パスワード認証を使用します。Securityサンプル・アプリケーションでは、アプリケーションを使用している学生が固有のIDとパスワードを持っている必要があります。Securityサンプル・アプリケーションは、次のように動作します。
1.
|
クライアント・アプリケーションには、ログオン・メソッドがあります。このオペレーションでは、ドメインにログオンする過程で取得されるPrincipalAuthenticatorオブジェクトのオペレーションが呼び出されます。
|
2.
|
サーバー・アプリケーションは、 Registrarオブジェクトの get_student_details()メソッドを実装し、学生に関する情報を返します。ユーザーが認証され、ログオンが完了すると、 get_student_details()メソッドは、データベース内の学生の情報にアクセスし、クライアントのログオン・メソッドが必要とする学生の情報を取得します。
|
3.
|
Securityサンプル・アプリケーションのデータベースには、コースと学生に関する情報が格納されています。
|
図10-1に、Securityサンプル・アプリケーションを示します。
Securityサンプル・アプリケーションのソース・ファイルは、Oracle Tuxedoソフトウェアの
\samples\corba\universityディレクトリにあります。Securityサンプル・アプリケーションのビルドと実行の詳細は、
『CORBA Universityサンプル・アプリケーション・ガイド』を参照してください。
パスワード認証を使用する場合、次を実行するクライアント・アプリケーション・コードを記述します。
1.
|
Bootstrapオブジェクトを使用し、指定したOracle TuxedoドメインでSecurityCurrentオブジェクトのリファレンスを取得します。ホストとポートのアドレス形式、 corbaloc URLアドレス形式、または corbalocs URLアドレス形式を使用できます。
|
2.
|
SecurityCurrentオブジェクトからPrincipalAuthenticatorオブジェクトを取得します。
|
3.
|
次のいずれかのメソッドを使用してプリンシパルを認証します。
|
•
|
C++の場合 - Tobj::TuxedoSecurityを使用した SecurityLevel2::PrincipalAuthenticator::authenticate()
|
•
|
C++の場合 - Tobj::PrincipalAuthenticator::logon()
|
SecurityLevel2::PrincipalAuthenticatorインタフェースは、CORBAサービス・セキュリティ・サービス仕様で定義されます。このインタフェースには、プリンシパルの認証に使用する2つのメソッドがあります。メソッドが2つあるのは、プリンシパルの認証では複数の手順を必要とする可能性があるからです。
authenticate()メソッドでは、呼出し側は、認証を行い、必要に応じてこのセッションのプリンシパルの属性を選択できます。
CORBA環境は、Oracle Tuxedo製品のATMI環境にあるものと同様のセキュリティをサポートする機能でPrincipalAuthenticatorオブジェクトを拡張します。拡張機能は、
Tobj::PrincipalAuthenticatorインタフェースによって提供されます。
Tobj::PrincipalAuthenticatorインタフェース用に定義されたメソッドは、同等のCORBA定義のインタフェースの特化および単純化した形式を提供します。CORBAアプリケーションを開発する場合、CORBA定義の拡張かOracle Tuxedo拡張のいずれかを使用できます。
Tobj::PrincipalAuthenticatorインタフェースは、
SecurityLevel2::PrincipalAuthenticatorインタフェースと同じ機能を提供します。ただし、
SecurityLevel2::PrincipalAuthenticator::authenticate()メソッドとは異なり、
Tobj::PrincipalAuthenticatorインタフェースの
logon()メソッドは、Credentialsオブジェクトを返しません。結果として、複数のプリンシパルIDを使用するCORBAアプリケーションでは、ログオンの結果としてCredentialsオブジェクトを取り出す
logon()メソッドの直後に
Current::get_credentials()メソッドを呼び出す必要があります。ログオン・メソッドの直後のCredentialsオブジェクトの取得は、シリアライズされたアクセスで保護する必要があります。
注意:
|
ログオンの一部として指定したユーザー・データには、NULLを含めることはできません。
|
SecurityLevel2::PrincipalAuthenticator::authenticate()メソッドを使用するC++サンプル・コード
リスト10-3には、
SecurityLevel2::PrincipalAuthenticator::authenticate()メソッドを使用してパスワード認証を実行するC++サンプル・コードがあります。
リスト10-3
SecurityLevel2::PrincipalAuthenticator::authenticate()メソッドを使用するC++クライアント・アプリケーション
...
//Create Bootstrap object
Tobj_Bootstrap* bootstrap = new Tobj_Bootstrap(orb,
corbalocs://sling.com:2143);
//Get SecurityCurrent object
CORBA::Object_var var_security_current_oref =
bootstrap.resolve_initial_references(���SecurityCurrent���);
SecurityLevel2::Current_var var_security_current_ref =
SecurityLevel2::Current::_narrow(var_security_current_oref.in());
//Get the PrincipalAuthenticator
SecurityLevel2::PrincipalAuthenticator_var var_principal_authenticator =
var_security_current_oref->principal_authenticator();
const char * user_name = ���john���
const char * client_name = ���university���;
char system_password[31] = {���\0���};
char user_password[31] = {���\0���};
Tobj::PrincipalAuthenticator_ptr var_bea_principal_authenticator =
Tobj::PrincipalAuthenticator::_narrow(var_bea_principal_authenticator.in());
//Determine the security level
Tobj::AuthType auth_type = var_bea_principal_authenticator->get_auth_type();
switch (auth_type)
{
case Tobj::TOBJ_NOAUTH;
break;
case Tobj::TOBJ_SYSAUTH
strcpy(system_password, ���sys_pw���);
case Tobj::TOBJ_APPAUTH
strcpy(system_password, ���sys_pw���);
strcpy(user_password, ���john_pw���);
break;
}
if (auth_type != Tobj::TOBJ_NOAUTH)
{
SecurityLevel2::Credentials_var creds;
Security::Opaque_var auth_data;
Security::AttributeList_var privileges;
Security::Opaque_var cont_data;
Security::Opaque_var auth_spec_data;
var_bea_principalauthenticator->build_auth_data(user_name,
client_name,
system_password,
user_password,
NULL,
auth_data,
privileges);
Security::AuthenticationStatus status =
var_bea_principalauthenticator->authenticate(
Tobj::TuxedoSecurity,
user_name,
auth_data,
privileges,
creds,
cont_data, auth_spec_data);
if (status != Security::SecAuthSuccess)
{
//Failed authentication
return;
}
}
// Proceed with application
...
Tobj::PrincipalAuthenticator::logon()メソッドを使用するC++サンプル・コード
リスト10-4には、
Tobj::PrincipalAuthenticator::logon()メソッドを使用してパスワード認証を実行するC++サンプル・コードがあります。
リスト10-4
Tobj::PrincipalAuthenticator::logon()メソッドを使用するC++クライアント・アプリケーション
...
CORBA::Object_var var_security_current_oref =
bootstrap.resolve_initial_references(���SecurityCurrent���);
SecurityLevel2::Current_var var_security_current_ref =
SecurityLevel2::Current::_narrow(var_security_current_oref.in());
//Get the PrincipalAuthenticator
SecurityLevel2::PrincipalAuthenticator_var var_principal_authenticator_oref =
var_security_current_oref->principal_authenticator();
//Narrow the PrincipalAuthenticator
Tobj::PrincipalAuthenticator_var var_bea_principal_authenticator =
Tobj::PrincipalAuthenticator::_narrow
var_principal_authenticator_oref.in());
const char * user_name = ���john���
const char * client_name = ���university���;
char system_password[31] = {���\0���};
char user_password[31] = {���\0���};
//Determine the security level
Tobj::AuthType auth_type = var_bea_principal_authenticator->get_auth_type();
switch (auth_type)
{
case Tobj::TOBJ_NOAUTH;
break;
case Tobj::TOBJ_SYSAUTH
strcpy(system_password, ���sys_pw���);
case Tobj::TOBJ_APPAUTH
strcpy(system_password, ���sys_pw���);
strcpy(user_password, ���john_pw���);
break;
}
if (auth_type != Tobj::TOBJ_NOAUTH)
{
SecurityLevel2::Credentials_var creds;
Security::Opaque_var auth_data;
Security::AttributeList_var privileges;
Security::Opaque_var cont_data;
Security::Opaque_var
auth_spec_data;
//Determine the security level
Tobj::AuthType auth_type = var_bea_principal_authenticator->get_auth_type();
Security::AuthenticationStatus status = var_bea_principal_authenticator->logon(
user_name,
client_name,
system_password,
user_password,
0);
if (status != Security::SecAuthSuccess)
{
//Failed authentication
return;
}
}
// Proceed with application
...
// Log off
try
{
logoff();
}
...
ここでは、CORBAアプリケーションでの証明書による認証の実装について説明します。
Secure Simpappサンプル・アプリケーション
Secure Simpappサンプル・アプリケーションは、既存のSimpappサンプル・アプリケーションを使用し、SSLプロトコルおよび証明書による認証で保護された通信をサポートするようにコードおよび構成ファイルを変更します。
Secure Simpappサンプル・アプリケーションのサーバー・アプリケーションは、次の2つのメソッドを持つCORBAオブジェクトの実装を提供します。
•
|
upperメソッドは、クライアント・アプリケーションから文字列を受け取り、その文字列を大文字に変換します。
|
•
|
lowerメソッドは、クライアント・アプリケーションから文字列を受け取り、その文字列を小文字に変換します。
|
Simpappサンプル・アプリケーションは、証明書による認証とSSLプロトコルをサポートするために次のように変更されました。
•
|
UBBCONFIGファイルの ISLセクションで、IIOPリスナー/ハンドラに対してSSLプロトコルを構成するために、ISLコマンドの -a、 -S、 -z、および -Zオプションが指定されています。
|
•
|
UBBCONFIGファイルの ISLセクションでは、IIOPリスナー/ハンドラに対する証明資料を指定するために、 SEC_PRINCIPAL_NAME、 SEC_PRINCIPAL_LOCATION、および SEC_PRINCIPAL_PASSVARパラメータが定義されています。
|
•
|
CORBAクライアント・アプリケーションのコードは、 corbalocs URLアドレス形式を使用します。
|
•
|
CORBAクライアント・アプリケーションのコードは、 SecurityLevel2::PrincipalAuthenticatorインタフェースの authenticate()メソッドを使用し、プリンシパルを認証して、プリンシパルの資格証明を取得します。
|
C++ Secure Simpappサンプル・アプリケーションのソース・ファイルは、Oracle Tuxedoソフトウェアの
\samples\corba\simpappSSLディレクトリにあります。Secure Simpappサンプル・アプリケーションのビルドと実行の手順については、
9-1ページの「CORBAサンプル・アプリケーションのビルドと実行」を参照してください。
証明書による認証を使用する場合、次を実行するクライアント・アプリケーション・コードを記述します。
1.
|
Bootstrapオブジェクトを使用し、指定したOracle TuxedoドメインでSecurityCurrentオブジェクトのリファレンスを取得します。 corbalocs URLアドレス形式を使用します。
|
2.
|
SecurityCurrentオブジェクトからPrincipalAuthenticatorオブジェクトを取得します。
|
3.
|
SecurityLevel2::PrincipalAuthenticatorインタフェースの authenticate()メソッドを使用し、プリンシパルを認証して、プリンシパルの資格証明を取得します。証明書による認証を使用する場合、 method引数に Tobj::CertificateBasedを指定し、 Security::Opaqueの auth_data引数として秘密鍵のパス・フレーズを指定します。
|
次の項には、証明書による認証の実装を示すC++のサンプル・コードがあります。
リスト10-5に、CORBA C++クライアント・アプリケーションでの証明書による認証の使用方法を示します。
リスト10-5
証明書による認証を使用するCORBA C++クライアント・アプリケーション
....
// Initialize the ORB
CORBA::ORB_var v_orb = CORBA::ORB_init(argc, argv, "");
// Create the bootstrap object
Tobj_Bootstrap bootstrap(v_orb.in(), corbalocs://sling.com:2143);
// Resolve SecurityCurrent
CORBA::Object_ptr seccurobj =
bootstrap.resolve_initial_references("SecurityCurrent");
SecurityLevel2::Current_ptr seccur =
SecurityLevel2::Current::_narrow(seccurobj);
// Perform certificate-based authentication
SecurityLevel2::Credentials_ptr the_creds;
Security::AttributeList_var privileges;
Security::Opaque_var continuation_data;
Security::Opaque_var auth_specific_data;
Security::Opaque_var response_data;
//Principal email address
char emailAddress[] = ���milozzi@bigcompany.com;���
// Pass phrase for principal���s digital certificate
char password[] = ���asdawrewe98infldi7;���
// Convert the certificate private key password to opaque
unsigned long password_len = strlen(password);
Security::Opaque ssl_auth_data(password_len);
// Authenticate principal certificate with principal authenticator
for(int i = 0; (unsigned long) i < password_len; i++)
ssl_auth_data[i] = password[i];
Security::AuthenticationStatus auth_status;
SecurityLevel2::PrincipalAuthenticator_var PA =
seccur->principal_authenticator();
auth_status = PA->authenticate(Tobj::CertificateBased,
emailAddress,
ssl_auth_data,
privileges,
the_creds,
continuation_data,
auth_specific_data);
while(auth_status == Security::SecAuthContinue) {
auth_status = PA->continue_authentication(
response_data,
the_creds,
continuation_data,
auth_specific_data);
}
...
Interoperable Naming Serviceメカニズムの使用
注意:
|
このメカニズムは、サード・パーティのクライアントORBで使用します。
|
Interoperable Naming Serviceメカニズムを使用し、適切な資格証明でOracle Tuxedoドメインにアクセスするには、次の手順を実行します。
1.
|
ORB::resolve_initial_references()オペレーションを使用して、Oracle Tuxedoドメインの SecurityLevel2::PrincipalAuthenticatorオブジェクトを取得します。 SecurityLevel2::PrincipalAuthenticatorオブジェクトは、固有のOracle委任型インタフェースではなく、標準CORBAサービス・セキュリティ・サービスに従い、認証プリンシパルを目的としたメソッドが含まれます。
|
2.
|
SecurityLevel2::PrincipalAuthenticatorオブジェクトの authenticate()メソッドを使用して、Oracle Tuxedoドメインにアクセスし、そのドメインに対してクライアントORBを認証します。Oracle Tuxedoドメインへのアクセスにセキュリティ資格証明が必要な場合、 authenticate()メソッドは、引き続き認証が必要であることを示すステータスを返します。
|
3.
|
SecurityLevel2::PrincipalAuthenticatorオブジェクトの continue_authentication()メソッドを使用し、暗号化されたログオンと資格証明情報をOracle Tuxedoドメインに渡します。
|
CORBA Interoperable Naming Service (INS)メカニズム使用の詳細は、「CORBAブートストラップ処理のプログラミング・リファレンス」
の
SecurityLevel2::PrincipalAuthenticatorインタフェースの項目を参照してください。
次では、認証を続行する前にクライアント資格証明を保護する例について説明します。
次の例では、J2SE v 1.4を使用するJavaクライアントがOracle Tuxedoアプリケーションにアクセスするものとします。
1.
|
$TUXDIR/udataobj/java/jdk/tuxsecenv.jarを CLASSPATHに追加します。
|
2.
|
クライアント・コードで、 com.bea.protectLogonData()を呼び出し、次に PrincipalAuthenticator continue_authentication()メソッドを呼び出します。
|
3.
|
次のサンプル・コードは、 protectLogonData()呼出しを示したものです。このコードは、 $TUXDIR/include: security.idl, lcs.idl, ns.idl, tobj.idlのIDLファイルから生成されるJavaクラスに依存します。
|
リスト10-6
CORBA INSを使用するサンプル・クライアント・コード
try {
// Initialize the ORB.
ORB orb = ORB.init(args, null);
// Authentication
org.omg.CORBA.Object sec_obj =
orb.resolve_initial_references("PrincipalAuthenticator");
org.omg.SecurityLevel2.PrincipalAuthenticator pa =
org.omg.SecurityLevel2.PrincipalAuthenticatorHelper.narrow(sec_obj);
String userName = "geni";
String clientName = "SimpleClient";
org.omg.Security.SecAttribute[] privilege =
new org.omg.Security.SecAttribute[1];
org.omg.SecurityLevel2.CredentialsHolder myCreds =
new org.omg.SecurityLevel2.CredentialsHolder();
org.omg.Security.OpaqueHolder cont_data = // continuation data
new org.omg.Security.OpaqueHolder();
org.omg.Security.OpaqueHolder auth_data = // auth specific data
new org.omg.Security.OpaqueHolder();
org.omg.Security.AuthenticationStatus status = pa.authenticate(
1,
userName,
clientName.getBytes(),
privilege,
myCreds,
cont_data,
auth_data
);
if (status.value() == 2) {
// further authentication required
org.omg.SecurityLevel2.Credentials creds = myCreds.value;
String secUid = new String(cont_data.value);
org.omg.Security.OpaqueHolder cont_data_2 =
new org.omg.Security.OpaqueHolder();
org.omg.Security.OpaqueHolder auth_data_2 =
new org.omg.Security.OpaqueHolder();
org.omg.Security.OpaqueHolder opqholder =
new org.omg.Security.OpaqueHolder();
byte[] ba0 = new byte[0];
String userPasswd = new String("abc123");
String domainPasswd = new String("abc123");
// encrypt the logon data
com.bea.LogonData td = new com.bea.LogonData();
int rc = td.protectLogonData(
userName,
clientName,
domainPasswd,
userPasswd,
secUid,
ba0,
opqholder
);
// continue authentication
status = pa.continue_authentication(
opqholder.value,
creds,
cont_data_2,
auth_data_2
);
}
else {
System.out.println("No security required");
}
.
.
.
invocations_options_required()メソッドの使用
証明書による認証を使用する場合、プリンシパルで必要なセキュリティ属性を定義しなければならない場合があります。たとえば、銀行取引アプリケーションでは、データをデータベースに転送する前に、特定のセキュリティ要件を満たさなければならない可能性があります。
SecurityLevel2::Credentialsインタフェースの
invocation_options_required()メソッドを使用すると、プリンシパルは、SSL接続のセキュリティ特性を明示的に制御できるようになります。
corbaloc URLアドレス形式を使用する場合、
SecurityLevel2::Credentialsインタフェースの
authenticate()およびinvocation_options_required()メソッドを使用し、ブートストラップ処理をセキュリティで保護できます。
invocation_options_required()メソッドを使用するには、次の手順を実行します。
1.
|
SecurityLevel2::PrincipalAuthenticatorオブジェクトの authenticate()メソッドを使用するアプリケーション・コードを記述し、証明書による認証が使用されるようにします。
|
リスト10-7では、
invocation_options_required()メソッドを使用したC++の例を示します。
リスト10-7
invocation_options_required()メソッドを使用したC++の例
// Initialize the ORB
CORBA::ORB_var v_orb = CORBA::ORB_init(argc, argv, "");
// Create the bootstrap object
Tobj_Bootstrap bootstrap(v_orb.in(), corbalocs://sling.com:2143);
// Resolve SecurityCurrent
CORBA::Object_ptr seccurobj =
bootstrap.resolve_initial_references("SecurityCurrent");
SecurityLevel2::Current_ptr seccur =
SecurityLevel2::Current::_narrow(seccurobj);
// Perform certificate-based authentication
SecurityLevel2::Credentials_ptr the_creds;
Security::AttributeList_var privileges;
Security::Opaque_var continuation_data;
Security::Opaque_var auth_specific_data;
Security::Opaque_var response_data;
//Principal email address
char emailAddress[] = ���milozzi@bigcompany.com;���
// Pass phrase for principal���s digital certificate
char password[] = ���asdawrewe98infldi7;���
// Convert the certificate private key password to opaque
unsigned long password_len = strlen(password);
Security::Opaque ssl_auth_data(password_len);
// Authenticate principal certificate with principal authenticator
for(int i = 0; (unsigned long) i < password_len; i++)
ssl_auth_data[i] = password[i];
Security::AuthenticationStatus auth_status;
SecurityLevel2::PrincipalAuthenticator_var PA =
seccur->principal_authenticator();
auth_status = PA->authenticate(Tobj::CertificateBased,
emailAddress,
ssl_auth_data,
privileges,
the_creds,
continuation_data,
auth_specific_data);
the_creds->invocation_options_required(
Security::Integrity|
Security::DetectReplay|
Security::DetectMisordering|
Security::EstablishTrustInTarget|
Security::EstalishTrustInClient|
Security::SimpleDelegation);
while(auth_status == Security::SecAuthContinue) {
auth_status = PA->continue_authentication(
response_data,
the_creds,
continuation_data,
auth_specific_data);
}