注意: | 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リスナー/ハンドラへの初期接続は、以下のいずれかに分かれます。
corbalocs
URLアドレス形式を使用すると、最低限、プリンシパルとIIOPリスナー/ハンドラの間の接続の整合性を保護するためにSSLプロトコルが使用されます。
表9-1に、2つのURLアドレス形式の違いを示します。
IIOPリスナー/ハンドラに対する呼出しが保護され、IIOPリスナー/ハンドラまたはCORBA C++ ORBは、SSLプロトコルの使用を有効にするように構成する必要があります。詳細は、「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形式も拡張します。
リスト9-1に、新しい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構文の機能を向上しています。リスト9-2に、複数のURLを指定する例を示します。
corbalocs://555xyz.com:1024,corbaloc://555xyz.com:1111
corbalocs://ctxobj.com:3434,corbalocs://mthd.com:3434,corbaloc://force.com:1111
リスト9-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プロトコル用に構成する際の詳細は、「SSLプロトコルの構成」を参照してください。
ここでは、CORBAアプリケーションでのパスワード認証の実装について説明します。
Securityサンプル・アプリケーションでは、パスワード認証を使用します。 Securityサンプル・アプリケーションでは、アプリケーションを使用している学生が固有のIDとパスワードを持っている必要があります。 Securityサンプル・アプリケーションは、以下のように動作します。
Registrar
オブジェクトのget_student_details()
メソッドを実装し、学生に関する情報を返します。 ユーザーが認証され、ログオンが完了すると、get_student_details()
メソッドは、データベース内の学生の情報にアクセスし、クライアントのログオン・メソッドが必要とする学生の情報を取得します。図9-1に、Securityサンプル・アプリケーションを示します。
Securityサンプル・アプリケーションのソース・ファイルは、Oracle Tuxedoソフトウェアの\samples\corba\university
ディレクトリにあります。Securityサンプル・アプリケーションのビルドと実行の詳細は、『CORBA Universityサンプル・アプリケーション・ガイド』を参照してください。
パスワード認証を使用する場合、以下を実行するクライアント・アプリケーション・コードを記述します。
SecurityLevel2::PrincipalAuthenticator
インタフェースは、CORBAサービス・セキュリティ・サービス仕様で定義されます。 このインタフェースには、プリンシパルの認証に使用する2つのメソッドがあります。 メソッドが2つあるのは、プリンシパルの認証では複数の手順を必要とする可能性があるからです。 authenticate()
メソッドでは、呼出し側は、認証を行い、必要に応じてこのセッションのプリンシパルの属性を選択できます。
CORBA環境は、Oracle Texudo製品の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のサンプル・コードについては、「オートメーション・セキュリティ・リファレンス」を参照してください。
リスト9-3には、SecurityLevel2::PrincipalAuthenticator::authenticate()
メソッドを使用してパスワード認証を実行するC++サンプル・コードがあります。
...
//Create Bootstrap objectTobj_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
...
リスト9-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サンプル・アプリケーションは、既存のSimpappサンプル・アプリケーションを使用し、SSLプロトコルおよび証明書による認証で保護された通信をサポートするようにコードおよび構成ファイルを変更します。
Secure Simpappサンプル・アプリケーションのサーバー・アプリケーションは、以下の2つのメソッドを持つCORBAオブジェクトの実装を提供します。
Simpappサンプル・アプリケーションは、証明書による認証とSSLプロトコルをサポートするために以下のように変更されました。
UBBCONFIG
ファイルのISL
セクションで、IIOPリスナー/ハンドラに対してSSLプロトコルを構成するために、ISLコマンドの-a
、-S
、-z
、および-Z
オプションが指定されています。UBBCONFIG
ファイルのISL
セクションでは、IIOPリスナー/ハンドラに対する証明資料を指定するために、SEC_PRINCIPAL_NAME
、SEC_PRINCIPAL_LOCATION
、およびSEC_PRINCIPAL_PASSVAR
パラメータが定義されています。corbalocs
URLアドレス形式を使用します。SecurityLevel2::PrincipalAuthenticator
インタフェースのauthenticate()
メソッドを使用し、プリンシパルを認証して、プリンシパルの資格証明を取得します。 C++ Secure Simpappサンプル・アプリケーションのソース・ファイルは、Oracle Tuxedoソフトウェアの\samples\corba\simpappSSL
ディレクトリにあります。Secure Simpappサンプル・アプリケーションのビルドと実行の手順については、「CORBAサンプル・アプリケーションのビルドと実行」を参照してください。
証明書による認証を使用する場合、以下を実行するクライアント・アプリケーション・コードを記述します。
corbalocs
URLアドレス形式を使用します。SecurityLevel2::PrincipalAuthenticator
インタフェースのauthenticate()
メソッドを使用し、プリンシパルを認証して、プリンシパルの資格証明を取得します。証明書による認証を使用する場合、method
引数にTobj::CertificateBased
を指定し、Security::Opaque
のauth_data
引数として秘密鍵のパス・フレーズを指定します。次の項には、証明書による認証の実装を示すC++のサンプル・コードがあります。
リスト9-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);
}
...
注意: | このメカニズムは、サード・パーティのクライアントORBで使用します。 |
Interoperable Naming Serviceメカニズムを使用し、適切な資格証明でOracle Tuxedoドメインにアクセスするには、次の手順を実行します。
ORB::resolve_initial_references()
オペレーションを使用して、Oracle TuxedoドメインのSecurityLevel2::PrincipalAuthenticator
オブジェクトを取得します。 SecurityLevel2::PrincipalAuthenticator
オブジェクトは、固有のOracle委譲型インタフェースではなく、標準CORBAサービス・セキュリティ・サービスに従い、認証プリンシパルを目的としたメソッドが含まれます。SecurityLevel2::PrincipalAuthenticator
オブジェクトのauthenticate()
メソッドを使用して、Oracle Tuxedoドメインにアクセスし、そのドメインに対してクライアントORBを認証します。Oracle Tuxedoドメインへのアクセスにセキュリティ資格証明が必要な場合、authenticate()
メソッドは、引き続き認証が必要であることを示すステータスを返します。SecurityLevel2::PrincipalAuthenticator
オブジェクトのcontinue_authentication()
メソッドを使用し、暗号化されたログオンと資格証明情報をOracle Tuxedoドメインに渡します。 CORBA Interoperable Naming Service (INS)メカニズム使用の詳細は、「CORBAブートストラップ処理のプログラミング・リファレンス」のSecurityLevel2::PrincipalAuthenticator
インタフェースの項目を参照してください。
以下では、認証を続行する前にクライアント資格証明を保護する例について説明します。
次の例では、J2SE v 1.4を使用するJavaクライアントがOracle Tuxedoアプリケーションにアクセスするものとします。
$TUXDIR/udataobj/java/jdk/tuxsecenv.jar
をCLASSPATH
に追加します。 com.bea.protectLogonData()
を呼び出し、次にPrincipalAuthenticator continue_authentication()
メソッドを呼び出します。 protectLogonData()
呼出しを示したものです。 このコードは、$TUXDIR/include: security.idl, lcs.idl, ns.idl, tobj.idl
のIDLファイルから生成されるJavaクラスに依存します。 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");
}
.
.
.
証明書による認証を使用する場合、プリンシパルで必要なセキュリティ属性を定義しなければならない場合があります。 たとえば、銀行取引アプリケーションでは、データをデータベースに転送する前に、特定のセキュリティ要件を満たさなければならない可能性があります。 SecurityLevel2::Credentials
インタフェースのinvocation_options_required()
メソッドを使用すると、プリンシパルは、SSL接続のセキュリティ特性を明示的に制御できるようになります。 corbaloc
URLアドレス形式を使用する場合、SecurityLevel2::Credentials
インタフェースのauthenticate()
メソッドとinvocation_options_required()
メソッドを使用し、ブートストラップ処理をセキュリティで保護できます。
invocation_options_required()
メソッドを使用するには、次の手順を実行します。
SecurityLevel2::PrincipalAuthenticator
オブジェクトのauthenticate()
メソッドを使用するアプリケーション・コードを記述し、証明書による認証が使用されるようにします。invocation_options_required()
メソッドを使用して、プリンシパルで必要なセキュリティ属性を指定します。セキュリティ・オプションのリストについては、「C++セキュリティ・リファレンス」のinvocation_options_required()
メソッドの項目および「Javaセキュリティ・リファレンス」を参照してください。 リスト9-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_cre
ds->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);
}