目次 前 次 PDF


セキュリティを実装するCORBAアプリケーション

セキュリティを実装するCORBAアプリケーション
このトピックには次の項が含まれます:
注意:
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アドレス形式の違い
URLアドレス形式
機能
corbaloc
デフォルトでは、IIOPリスナー/ハンドラに対する呼出しは保護されません。オプションで、IIOPリスナー/ハンドラに対してSSLプロトコルを構成します。
プリンシパルは、SecurityLevel2::PrincipalAuthenticatorインタフェースのauthenticate()メソッドおよびSecurityLeve12::Credentialsインタフェースのinvocation_options_required()メソッドを使用し、証明書による認証を使用するように指定してブートストラップ処理をセキュリティ保護します。
corbalocs
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に、新しい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アドレス形式の指定の例
corbalocs://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アドレス形式の使用
デフォルトでは、corbaloc URLアドレス形式およびパスワード認証を使用する場合に、IIOPリスナー/ハンドラに対する呼出しは保護されていません。したがって、すべての通信は、次のセキュリティ攻撃に対して脆弱です。
中間者攻撃。接続が実行されたプリンシパルが望ましいプリンシパルかどうかを検証できないという理由によります。
サービス拒否攻撃。オブジェクト参照が返されない、返されたオブジェクト参照が無効、またはセキュリティ・トークンが無効という理由によります。
スニッファ攻撃。情報を自由に送信できるので、パケット・スニッファを持つユーザーが、暗号化されていない(たとえば、ユーザー名/パスワード情報のみが暗号化されている)メッセージの内容を見ることができるという理由によります。
改ざん攻撃。情報の整合性が保護されないという理由によります。メッセージの内容が変更されても、その変更は検出されません。
リプレイ攻撃。同じリクエストが繰り返し送信されても、それが検出されないという理由によります。
corbaloc URLアドレス形式を使用する際に、SecurityLevel2::PrincipalAuthenticator::authenticate()メソッドを使用して、証明書による認証を使用するように指定し、Credentialsオブジェクトのinvocation_methods_requiredメソッドを呼び出して、ブートストラップ処理を保護できます。
注意:
IIOPリスナー/ハンドラがSSLプロトコル用に構成されているものの、証明書による認証用に構成されておらず、corbaloc URLアドレス形式が使用されている場合、指定したCORBAオブジェクトに対する呼出しによってINVALID_DOMAIN例外が発生します。
既存のCORBAアプリケーションを、ホストとポートのアドレス形式ではなくcorbaloc URL形式に移行することをお薦めします。
corbalocs 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サンプル・アプリケーションでは、パスワード認証を使用します。Securityサンプル・アプリケーションでは、アプリケーションを使用している学生が固有のIDとパスワードを持っている必要があります。Securityサンプル・アプリケーションは、次のように動作します。
1.
クライアント・アプリケーションには、ログオン・メソッドがあります。このオペレーションでは、ドメインにログオンする過程で取得されるPrincipalAuthenticatorオブジェクトのオペレーションが呼び出されます。
2.
サーバー・アプリケーションは、Registrarオブジェクトのget_student_details()メソッドを実装し、学生に関する情報を返します。ユーザーが認証され、ログオンが完了すると、get_student_details()メソッドは、データベース内の学生の情報にアクセスし、クライアントのログオン・メソッドが必要とする学生の情報を取得します。
3.
Securityサンプル・アプリケーションのデータベースには、コースと学生に関する情報が格納されています。
図10-1に、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を含めることはできません。
次の項には、パスワード認証の実装を示すC++のサンプル・コードがあります。Visual Basicのサンプル・コードについては、16-1ページの「オートメーション・セキュリティ・リファレンス」を参照してください。
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_NAMESEC_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サンプル・アプリケーションのビルドと実行」を参照してください。
CORBAクライアント・アプリケーションの記述
証明書による認証を使用する場合、次を実行するクライアント・アプリケーション・コードを記述します。
1.
Bootstrapオブジェクトを使用し、指定したOracle TuxedoドメインでSecurityCurrentオブジェクトのリファレンスを取得します。corbalocs URLアドレス形式を使用します。
2.
SecurityCurrentオブジェクトからPrincipalAuthenticatorオブジェクトを取得します。
3.
SecurityLevel2::PrincipalAuthenticatorインタフェースのauthenticate()メソッドを使用し、プリンシパルを認証して、プリンシパルの資格証明を取得します。証明書による認証を使用する場合、method引数にTobj::CertificateBasedを指定し、Security::Opaqueauth_data引数として秘密鍵のパス・フレーズを指定します。
次の項には、証明書による認証の実装を示すC++のサンプル・コードがあります。
証明書による認証の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.jarCLASSPATHに追加します。
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()メソッドを使用するアプリケーション・コードを記述し、証明書による認証が使用されるようにします。
2.
invocation_options_required()メソッドを使用して、プリンシパルで必要なセキュリティ属性を指定します。セキュリティ・オプションのリストについては、14-1ページの「C++セキュリティ・リファレンス」invocation_options_required()メソッドの項目および15-1ページの「Javaセキュリティ・リファレンス」を参照してください。
リスト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);
              }
 

Copyright ©1994, 2017,Oracle and/or its affiliates. All rights reserved