できるだけ GSS-API が提供するデフォルトの機構と QOP を使用することを強く推奨しますが (OIDを参照)、なんらかの理由で機構または QOP の OID を指定する必要がある場合もあります。したがって、この章では機構または QOP の OID を指定する方法について簡単に説明します。
GSS-API では、機構と QOP を人が読める形式で表示することができます。Solaris システムでは、/etc/gss/mech と /etc/gss/qop の 2 つのファイルに、使用できる機構と QOP についての情報が含まれています。この 2 つのファイルへのアクセス権がない場合 (ほとんどの場合、リモートマシンが許可していないため)、たとえば、その機構または QOP 用に公開されているインターネット標準などの他のソースから文字列リテラルを提供する必要があります。
/etc/gss/mech ファイルを調べると、どの機構を使用できるかが分かります。/etc/gss/mech には、機構名が ASCII 文字列と数値の両方の形式で格納されています。/etc/gss/mech の各行は、機構名 (ASCII 文字列)、機構の OID (数値)、その機構が提供するサービスを実装する共有ライブラリ、およびオプションでサービスを実装するカーネルモジュールから構成されます。例 C–1 に /etc/gss/mech ファイルの例を示します。
# # Copyright (c) 2000, by Sun Microsystems, Inc. # All rights reserved. # #ident "@(#)mech 1.6 00/12/04 SMI" # # This file contains the GSS-API based security mechanism names, # its object identifier (OID) and a shared library that implements # the services for that mechanism under GSS-API. # # Mechanism Name Object Identifier Shared Library Kernel Module # diffie_hellman_640_0 1.3.6.4.1.42.2.26.2.4 dh640-0.so.1 diffie_hellman_1024_0 1.3.6.4.1.42.2.26.2.5 dh1024-0.so.1 kerberos_v5 1.2.840.113554.1.2.2 gl/mech_krb5.so gl_kmech_krb5 |
/etc/gss/qop ファイルには、インストールされている各機構がサポートするすべての QOP が、ASCII 文字列と対応する 32 ビット整数の両方の形式で格納されています。例 C–2 に /etc/gss/qop ファイルの例を示します。
# # Copyright (c) 2000, by Sun Microsystems, Inc. # All rights reserved. # #ident "@(#)qop 1.3 00/11/09 SMI" # # This file contains information about the GSS-API based quality of # protection (QOP), its string name and its value (32-bit integer). # # QOP string QOP Value Mechanism Name # GSS_KRB5_INTEG_C_QOP_DES_MD5 0 kerberos_v5 GSS_KRB5_CONF_C_QOP_DES 0 kerberos_v5 |
旧バージョンの GSS-API との下位互換性のため、この実装の GSS-API は gss_str_to_oid() 関数をサポートします。gss_str_to_oid() は機構または QOP を表す文字列を (ASCII 文字列または数値のどちらでも) OID に変換します。
デフォルトの機構と QOP を使用することが強く推奨されているため、gss_str_to_oid()、gss_oid_to_str()、および gss_release_oid() をサポートしていない実装の GSS-API もあります。
機構または QOP を表す文字列は、アプリケーション内でハードコード化することも、ユーザー入力から取得することも可能です。しかし、必ずしもすべての実装の GSS-API がこの関数をサポートしているわけではないため、アプリケーションはこの関数に依存すべきではありません。
機構を表す数値には、次の 2 種類の形式があります。1 つの形式は次のとおりです。
{ 1 2 3 4 }
1.2.3.4
gss_str_to_oid() は GSS-API データ領域を割り当てるため、終了時には、割り当てられた OID を gss_release_oid() 関数で削除する必要があります。gss_str_to_oid() と同様に、gss_release_oid() も一般的にサポートされている関数ではありません。したがって、移植性を最大限にしたいプログラムはこの関数に依存すべきではありません。
gss_str_to_oid() は常に使用できるわけではなく、また推奨されるものではないため、使用できる機構を調べて選択するために、より好ましい方法が (若干複雑ですが) いくつか存在します。1 つは、機構 OID を「手動で」構築し、使用できる機構の集合と比較する方法です。もう 1 つは、使用できる機構の集合を取得して、その中から 1 つを選択する方法です。
typedef struct gss_OID_desc struct { OM_uint32 length; void *elements; } gss_OID_desc, *gss_OID; |
機構 OID を構築する 1 つの方法は、gss_OID を宣言して、次に、その要素を手作業で初期化して、機構の OID を表すようにします。前述のとおり、elements 値はハードコード化するか、表から検索するか、あるいは、ユーザー入力から取得できます。この方法は gss_str_to_oid() を使用するよりも手がかかりますが、同じ効果が得られます。
次に、手作業で構築した gss_OID を、使用できる機構の集合と比較します。使用できる機構の集合は、gss_indicate_mechs() または gss_inquire_mechs_for_name() の関数から戻されます。手作業で構築した機構 OID が、使用できる機構の集合の中に存在するかどうかを調べるには、gss_test_oid_set_member() 関数を使用します。gss_test_oid_set_member() がエラーを戻さなかった場合、手作業で構築した OID は GSS-API トランザクション用の機構として使用できます。
OID を手作業で構築する代わりに、gss_indicate_mechs() または gss_inquire_mechs_for_name() を使用すると、使用できる機構の gss_OID_set を取得できます。次に、gss_OID_set の形式を示します。
typedef struct gss_OID_set_desc_struct { OM_uint32 length; void *elements; } gss_OID_set_desc, *gss_OID_set; |