TimesTen Client/Server用のTransport Layer Security

クライアント/サーバー接続を使用する場合、オプションで、クライアントとサーバー間の暗号化された通信にTLSを構成して使用できます。

TimesTenでは、次の暗号スイートがサポートされます:

  • SSL_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256

  • SSL_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384

  • SSL_RSA_WITH_AES_128_CBC_SHA256

CA提供の証明書をデコードするためにSSL_RSA_WITH_AES_128_CBC_SHA256が必要になる場合がありますが、ネットワーク・トラフィックには使用しないでください。

この項では、TimesTenによるクライアント/サーバー用のTLSのサポートについて説明します。内容は次のとおりです:

クライアント/サーバーでの証明書の使用について

自己署名証明書のために、TimesTenには、TLS用の証明書を生成するttCreateCertsユーティリティがあります。このユーティリティは、インスタンスの作成(TimesTen Classic)およびグリッドの作成(TimesTen Scaleout)中にTimesTenによって使用されます。

TimesTenは、Oracleウォレットを使用して証明書を格納します。「キーストア」とも呼ばれるこれらのウォレットの一般的な情報については、『Oracle Database Advanced Securityガイド』TDEマスター暗号化キーの格納のためのキーストアの動作を参照してください。

ノート:

サーバーは、既存のTimesTenユーザーIDとパスワード・メカニズムを使用してユーザーを認証しますが、TimesTenでは、サーバーがクライアント・ウォレットでアイデンティティを検証するクライアント認証の形式もサポートしています。これは、接続するクライアントが正当なクライアントであることをサーバーが確認するための方法ですが、ユーザーは引き続きユーザーIDとパスワードの資格証明を提供する必要があります。

TimesTen Classic:

  • TimesTenは、証明書を生成し、作成時にインスタンスに配置できます。
  • TimesTenサーバーには、独自の自己署名ルート証明書があります。

  • ユーザーは通常、クライアント・ウォレットを各クライアントにインポート(オプションでコピー)します。

TimesTen Scaleout:

  • TimesTenは、グリッドの作成時に証明書を生成し、最初の管理インスタンスに配置します。

  • 証明書は、グリッド・モデルの適用時にデータ・インスタンスに配布されます。

  • グリッドごとに、ウォレットに格納された1つのルート認証局(CA)があり、すべてのインスタンスで使用される単一の秘密キーと証明書があります。

  • ユーザーはクライアント・ウォレットをクライアント・システムにインポートします。

TimesTenによって生成された証明書について:

  • 生成される証明書は自己署名で、Oracleウォレットに格納されます。

  • ルートCAにはデフォルトの有効期限があります。この確認はユーザーが各自で行ってください。ルートCAが期限切れになると、すべてのサーバー証明書を再生成する必要があります。ルートCAが再生成されると、すべてのクライアントがそれを再インポートする必要があります。(この章の後半のTimesTen ClassicまたはTimesTen Scaleoutの証明書を生成するためのタスクの項には、証明書の再生成に関する情報も記載されています。)

  • クライアントは、ルート証明書(公開キー)をローカル・ウォレットに格納します。各インスタンスの公開キーを格納する必要はありません。

  • 作成されたウォレットは、パスワードなしの自動ログインまたはシングル・サインオン(SSO)ウォレットです。ウォレットへのアクセスは、ファイル・システム権限によって制御されます。

  • ウォレットはプラットフォームに依存しません。

  • 証明書は自己署名であるため、取り消すことはできません。ただし、証明書は必要に応じて再生成できます。

この章のほとんどの説明は、ttCreateCertsを使用して(TimesTenまたはユーザーによって直接)生成された自己署名証明書を使用するためのものですが、TimesTenではサード・パーティのCAによって署名された証明書の使用もサポートされています。「TimesTen Classicでのクライアント/サーバー用のCA署名証明書の使用」を参照してください。

各サーバーのウォレットには、ルート証明書によって署名された独自の公開キー/秘密キーのアイデンティティがあります。サーバーに接続する各クライアントには、そのサーバーのルート証明書が含まれるウォレットが必要です。(クライアントは、複数のデータベース・サービスに接続するために、オプションで複数のウォレットを持つことができます。)

クライアント/サーバー用のTLSの構成

クライアント/サーバー用のTLSには、サーバー側とクライアント側の両方の構成があります。

TLSのサーバー属性

これらは、クライアント/サーバー用のTLSの設定を決定するサーバー接続属性です。

「タスク2: TimesTen ClassicでのTLSのサーバー構成の設定」および「タスク2: TimesTen ScaleoutでのTLSのサーバー構成の設定」も参照してください。

  • Wallet: 証明書を配置したウォレットの場所を絶対パスとして指定します(クライアント上と同じディレクトリ・パスをお薦めします)。ttCreateCertsを使用した場合、これはserverWalletディレクトリのフルパスになります。

  • Encryption (暗号化フラグ): 次のいずれかの設定を使用します。これらの説明では、サーバーとクライアントの間で暗号スイート設定が一致していることを前提としています(該当する場合)。

    • accepted: クライアントによって必要とされる場合またはリクエストされた場合は、暗号化されたセッションを有効にします。それ以外の場合は、暗号化されていないセッションを使用します。これはデフォルトです。

    • rejected: 暗号化されていないセッションを要求します。(サーバーが暗号化をサポートしていない場合、TimesTenは、これがサーバー上の設定であるかのように動作します。)クライアントが暗号化を必要とする場合、接続は拒否されます。

    • requested: クライアントで許可されている場合は暗号化されたセッションをリクエストします(クライアントでrejected以外の設定が使用されている場合)。それ以外の場合は暗号化されていないセッションを使用します。

    • required: 暗号化されたセッションを要求します。クライアントが暗号化を拒否した場合、接続を拒否します。

    暗号スイートの設定を考慮して、サーバーとクライアント間のこの属性の設定の可能な組合せの結果についての概要は、この項で後述する表3-1を参照してください。

  • CipherSuites: クライアントの設定に応じて、使用できる暗号スイートがリストされます。目的の暗号スイートをカンマで区切って、優先順位に従って指定します。サポートされている暗号スイートのリストは、「TimesTen Client/Server用のTransport Layer Security」を参照してください。TLSを使用するには、サーバーおよびクライアントの設定に少なくとも1つの共通スイートが含まれている必要があります。

  • SSLClientAuthentication: TLSクライアント認証が必要か(1の設定)、または必要でないか(デフォルトの0の設定)を指定します。クライアント認証を使用する場合、サーバーはクライアントから提示されたアイデンティティを検証し、クライアント・ウォレットにアイデンティティ(公開キーまたは秘密キー)が必要です。クライアント認証の設定にかかわらず、サーバー認証が実行され、クライアントがサーバーを検証します。

    サーバーとクライアントのSSLClientAuthentication設定は同一である必要があります。

ノート:

前述のサーバー接続属性のかわりに、サーバー上のインスタンス・レベルのTimesTen構成ファイルtimesten_home/conf/timesten.confで、これらの同等の属性を使用できます。接続属性設定が優先されます。

  • server_wallet

  • server_encryption

  • server_cipher_suites

  • ssl_client_authentication

TimesTenインスタンスに複数のデータベースがある場合、これらの設定はすべてのデータベースに適用されますが、サーバーDSN定義によって各データベースに対して上書きできます。

TimesTenは、アクティブなTLSセッションでより強固なセキュリティを確保するために新しいセッション・キーが生成されるTLSセッションの再ネゴシエーションをサポートしています。セッションの再ネゴシエーションは、転送されたデータ量、または経過した時間に応じて実行されます。この機能を有効にする場合は、サーバーDSN定義で次のいずれかの属性を使用します。

  • SSLRenegotiationSize: セッションの再ネゴシエーションが実行されるまでの、クライアントとサーバーの間のいずれかの方向のデータ転送のMB数を指定します。デフォルト設定は0で、転送されたMBに基づく再ネゴシエーションは行われません。

  • SSLRenegotiationPeriod: セッションの再ネゴシエーションが実行されるまでの時間を分単位で指定します。デフォルト設定は0で、時間に基づく再ネゴシエーションは行われません。

両方の属性がゼロ以外の値に設定されている場合、最初に発生した状況によって再ネゴシエーションが行われます。

次の表に、暗号スイートの設定を考慮した、クライアントとサーバーの間で可能なすべての暗号化フラグ設定の組合せの結果を示します。

表3-1 サーバーとクライアントの暗号化設定の組合せの結果

サーバー暗号化フラグ設定 クライアント暗号化フラグ設定 結果

accepted

accepted

接続が受け入れられ、暗号化はオフです。

accepted

rejected

接続が受け入れられ、暗号化はオフです。

accepted

requested

接続が受け入れられます。暗号スイートの設定間で重複がある場合は暗号化がオンになり、ない場合はオフになります。

accepted

required

暗号スイート設定間で重複がある場合、暗号化がオンになって接続が受け入れられます。ない場合は、接続が拒否されます。

rejected

accepted

接続が受け入れられ、暗号化はオフです。

rejected

rejected

接続が受け入れられ、暗号化はオフです。

rejected

requested

接続が受け入れられ、暗号化はオフです。

rejected

required

接続が拒否されます。

requested

accepted

接続が受け入れられます。暗号スイートの設定間で重複がある場合は暗号化がオンになり、ない場合はオフになります。

requested

rejected

接続が受け入れられ、暗号化はオフです。

requested

requested

接続が受け入れられます。暗号スイートの設定間で重複がある場合は暗号化がオンになり、ない場合はオフになります。

requested

required

暗号スイート設定間で重複がある場合、暗号化がオンになって接続が受け入れられます。ない場合は、接続が拒否されます。

required

accepted

暗号スイート設定間で重複がある場合、暗号化がオンになって接続が受け入れられます。ない場合は、接続が拒否されます。

required

rejected

接続が拒否されます。

required

requested

暗号スイート設定間で重複がある場合、暗号化がオンになって接続が受け入れられます。ない場合は、接続が拒否されます。

required

required

暗号スイート設定間で重複がある場合、暗号化がオンになって接続が受け入れられます。ない場合は、接続が拒否されます。

ノート:

自動クライアント・フェイルオーバーが有効になっていてフェイルオーバーが発生した場合、元の接続の暗号化属性の設定が継続して使用されます。フェイルオーバーサーバーの暗号化設定は、元のサーバーと同じである必要があります。(自動クライアント・フェイルオーバーの詳細は、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』自動クライアント・フェイルオーバーの使用を参照してください。)

TLSのクライアント属性

これらは、クライアント/サーバー用のTLSの設定を決定するクライアント接続属性です。

「タスク3: TimesTen ClassicでのTLSのクライアント構成の設定」および「タスク3: TimesTen ScaleoutでのTLSのクライアント構成の設定」も参照してください。

ノート:

クライアントDSN定義と接続文字列の両方で属性が設定されている場合は、接続文字列の設定が優先されます。

  • Wallet: 証明書を配置したウォレット・ディレクトリを絶対パスとして指定します(サーバー上と同じディレクトリ・パスをお薦めします)。ttCreateCertsを使用した場合、これはclientWalletディレクトリのフルパスになります。

  • Encryption (暗号化フラグ): 次のいずれかの設定を使用します。これらの説明では、サーバーとクライアントの間で暗号スイート設定が一致していることを前提としています(該当する場合)。

    • accepted: サーバーによって必要とされる場合またはリクエストされた場合は、暗号化されたセッションを有効にします。それ以外の場合は、暗号化されていないセッションを使用します。これはデフォルトです。

    • rejected: 暗号化されていないセッションを要求します。(クライアントが暗号化をサポートしていない場合、TimesTenは、これがクライアント上の設定であるかのように動作します。)サーバーが暗号化を必要とする場合、接続は拒否されます。

    • requested: サーバーで許可されている場合は暗号化されたセッションをリクエストします(サーバーでrejected以外の設定が使用されている場合)。それ以外の場合は暗号化されていないセッションを使用します。

    • required: 暗号化されたセッションを要求します。サーバーが暗号化を拒否する場合、接続は拒否されます。

    暗号スイートの設定を考慮して、サーバーとクライアントの間で可能な各設定の組合せの結果の概要は、表3-1を参照してください。

  • CipherSuites: サーバーの設定に応じて、使用できる暗号スイートがリストされます。目的の暗号スイートをカンマで区切って、優先順位に従って指定します。サポートされている暗号スイートのリストは、「TimesTen Client/Server用のTransport Layer Security」を参照してください。TLSを使用するには、サーバーおよびクライアントの設定に少なくとも1つの共通スイートが含まれている必要があります。

  • SSLClientAuthentication: TLSクライアント認証が必要か(1の設定)、または必要でないか(デフォルトの0の設定)を指定します。クライアント認証を使用する場合、サーバーはクライアントから提示されたアイデンティティを検証し、クライアント・ウォレットにアイデンティティ(公開キーまたは秘密キー)が必要です。クライアント認証の設定にかかわらず、サーバー認証が実行され、クライアントがサーバーを検証します。

    サーバーとクライアントのSSLClientAuthentication設定は同一である必要があります。

ノート:

前述のクライアント接続属性のかわりに、クライアント上のインスタンス・レベルのTimesTen構成ファイルtimesten_home/conf/timesten.confで、これらの同等の属性を使用できます。接続属性設定が優先されます。

  • client_wallet

  • client_cipher_suites

  • server_encryption

  • ssl_client_authentication

TimesTenインスタンスに複数のクライアントDSNがある場合、これらの設定はすべてのクライアントDSNに適用されますが、クライアントDSN定義によって各クライアントに対して上書きできます。

TimesTen Classicでのクライアント/サーバー用のTLSの使用

これらは、TimesTenによって生成された証明書とともにTimesTen Classicのクライアント/サーバーにTLSを使用するステップです。

または、サード・パーティのCA署名証明書を使用できます。「TimesTen Classicでのクライアント/サーバー用のCA署名証明書の使用」を参照してください。

タスク1: ttInstanceCreateを使用した証明書の生成およびTLS属性の設定

(インストールbinディレクトリから) ttInstanceCreateユーティリティを実行すると、証明書が作成されるように調整できます。

ノート:

  • ttInstanceCreateによって生成された証明書は、レプリケーションおよびクライアント/サーバーに使用できます。

  • TimesTen ttCreateCertsユーティリティを使用して、証明書を手動で生成することもできます。これは、失効などのなんらかの理由で証明書を再生成する必要がある場合や、単一のTimesTenインスタンスに複数のデータベースがあり、データベースごとに異なる証明書を使用する場合などに役立ちます。『Oracle TimesTen In-Memory Databaseリファレンス』ttCreateCertsを参照してください。

ttInstanceCreateコマンドラインで–serverEncryption (暗号化フラグ)および–serverCipherSuites (使用する暗号スイート)を設定します。暗号化および暗号スイート属性の詳細は、「TLSのサーバー属性」を参照してください。TimesTenで使用できる暗号スイートのリストは、「TimesTen Client/Server用のTransport Layer Security」を参照してください。

このコマンドは、tt221という名前のインスタンスを作成するために、インスタンスのconfディレクトリtimesten_home/confに証明書を生成します。

% installation_dir/bin/ttInstanceCreate -name tt221 -location instances_dir -serverEncryption required -serverCipherSuites SSL_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
Creating instance in instances_dir/tt221 ...
INFO: Creating certificates, this may take some time ...
ttCreateCerts : certificates created in instances_dir/tt221/conf
...
Instance created successfully.

これにより、ルート証明書、サーバー証明書およびクライアント証明書を含むウォレットが生成され、インスタンスのtimesten.confファイル(デフォルトでは後者の2つ)に次のエントリが追加されます:

server_encryption=required
server_cipher_suites=SSL_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
client_wallet=timesten_home/conf/clientWallet
server_wallet=timesten_home/conf/serverWallet

timesten_home/confディレクトリから、ttInstanceCreateの実行時に作成されるserverWalletおよびclientWalletディレクトリを次に示します。それぞれにウォレットcwallet.ssoが含まれます。(.certファイルおよびrootWalletディレクトリは無視してください。)

% ls
client1.cert  root.cert   server1.cert  sys.odbc.ini       timesten.conf
clientWallet  rootWallet  serverWallet  sys.ttconnect.ini

ノート:

後でインスタンスの-serverEncryptionおよび-serverCipherSuites設定を変更する場合は、ttInstanceModifyユーティリティを使用して変更できます。このユーティリティにはオプションもあります。ttInstanceModify -serverWalletオプションを使用して、ウォレットをコピーまたは別の場所に移動し、サーバー・ウォレットの新しい場所を指定できます。

証明書を生成したら、TimesTen ttAdminユーティリティの-certificateListオプションを使用して証明書に関する情報をリストできますが、ttAdminを使用するには、timesten_home/confディレクトリのsys.odbc.iniファイルに定義されているコマンドラインでデータベースを指定する必要があります。

このユーティリティは、sys.odbc.iniWallet接続属性またはインスタンス・レベルのtimesten.conf構成ファイルのserver_walletで示されているように、ウォレットが別の場所に配置されていないかぎり、timesten_home/confディレクトリを検索します。

この例は、データベースmydb用です。ttAdminを実行する前に、TimesTenデーモンを起動します。

% ttDaemonAdmin -start
TimesTen Daemon (PID: 733500, port: 6624) startup OK.
% ttAdmin -certificateList mydb
NAME                                               HOLDER                  EXPIRATION
timesten_home/conf/serverWallet/cwallet.sso        CN=server1,C=US         Fri Jul 30 23:08:02 UTC 2032

タスク2: TimesTen ClassicでのTLSのサーバー構成の設定

次の方法でサーバーのTLSを構成できます。

  • 暗号化フラグおよび暗号スイートは、前述のようにttInstanceCreateコマンドで指定されます。後で、設定できる追加のTLS構成属性もあります。特に、ウォレットの場所を設定します。

  • インスタンス・レベルでは、server_walletserver_cipher_suitesおよびserver_encryption属性など、timesten_home/confディレクトリのtimesten.confファイルのTLS属性を追加または更新できます。(server_cipher_suitesおよびserver_encryptionの初期値がttInstanceCreateで設定されていることを再確認してください。)timesten.confの値は、インスタンス上の任意のデータベースのデフォルト値として機能します。

  • データベース・レベルでは、TLSのサーバー属性は、timesten_home/conf/sys.odbc.iniのサーバーDSN定義で設定できます。特定のデータベースの場合、これらの設定はtimesten.confのインスタンス・レベルの設定をオーバーライドします。

サーバーDSN定義の次の抜粋では、ttInstanceCreateがサーバー・ウォレット・ディレクトリを配置した場所を指定しています:

[mydb]
Driver=timesten_home/install/lib/libtten.so
DataStore=databases_dir/mydb
...
Wallet=timesten_home/conf/serverWallet

または、ウォレット・ディレクトリを別の場所にコピーまたは移動し、Wallet設定でその場所を指定することもできます。ttInstanceModify -serverWalletユーティリティを使用してtimesten.confファイルの新しいウォレット・ディレクトリを更新するか、timesten.confファイルのserver_wallet属性を変更します。

使用可能な構成属性の詳細は、「TLSのサーバー属性」を参照してください。

タスク3: TimesTen ClassicでのTLSのクライアント構成の設定

クライアントDSN定義でクライアントのTLSを構成します。サーバーのsys.odbc.iniにあるクライアントDSN定義で、Encryption (暗号化フラグ)、CipherSuites (使用する暗号スイート)、およびWallet (クライアント・ウォレット・ディレクトリを指す)を手動で設定します。

たとえば、データベースmydbの場合:

[mydbCS]
TTC_SERVER=mydb_CS
TTC_SERVER_DSN=mydb
Wallet=timesten_home/conf/clientWallet
Encryption=required
CipherSuites=SSL_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384

次の代替方法にも注意してください:

  • サーバーから設定をエクスポートおよびインポートするかわりに、クライアント上のodbc.iniファイルに属性値を手動で設定できます。
  • ttIsqlユーティリティなど、特定の接続の接続文字列で属性値を設定できます:
    Command> connect "Driver=...;DataStore=...;Encryption=required;CipherSuites=SSL_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384";
  • クライアントのTimesTen構成ファイルtimesten_home/conf/timesten.confで、インスタンス・レベルで同等の属性を設定できます。server_encryptionclient_cipher_suitesclient_walletなどのこれらの設定がデフォルト値として使用されます。特定の接続に対するすべての接続属性設定が優先されます。

使用可能な構成属性の詳細は、「TLSのクライアント属性」を参照してください。

タスク4: TimesTen Classicでの証明書および構成のエクスポート

ttAdminユーティリティには、クライアント・ウォレットを含むZIPファイル、データベースへのアクセスに使用できるsys.odbc.iniファイル、および適用可能なその他のファイル(tnsnames.oraファイルなど)を出力する–clientExportAllオプションがあります。

サーバーのtimesten_home/binディレクトリからttAdminを実行します。コマンドラインで、目的のZIPファイルのパスと名前およびクライアントDSNを指定します。出力ZIPファイルのウォレットには、CA公開キー(サーバー証明書の検証用)と相互認証用のクライアント証明書が含まれます。

データベースmydbに対して次のコマンドラインを使用すると、ttAdminユーティリティによってファイルexports.zipが作成され、timesten_home/infoディレクトリに配置されます。

% ttAdmin -clientExportAll timesten_home/info/exports.zip mydbCS
Client definitions exported to timesten_home/info/exports.zip

exports.zipファイルには、次のsys.odbc.iniファイルおよびクライアントDSN名に基づくディレクトリ(この例ではmydbCSWallet)が含まれています。このディレクトリには、ttInstanceCreateによって作成されたクライアント・ウォレットcwallet.ssoが含まれています:

[mydbCS]
TTC_SERVER=mydb_CS
TTC_SERVER_DSN=mydb
# Wallet=timesten_home/conf/clientWallet
Encryption=required
CipherSuites=SSL_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
Wallet=mydbCSWallet

タスク5: TimesTen Classicでの証明書および構成のインポート

クライアントからttClientImportユーティリティを実行して、ttAdmin -clientExportAllコマンドで作成されたエクスポートZIPファイルの内容をインポートします。

通常、エクスポートZIPファイルをサーバーからクライアント上の目的の場所にコピーし、ttClientImportコマンドラインでその場所を指定します。ttClientImportユーティリティは、エクスポートされたウォレットおよびsys.odbc.iniファイル(およびその他のすべて)をインポートします。ユーティリティは、この例ではウォレット・ディレクトリmydbCSWallet(クライアントDSN名に基づく)をtimesten_home/confの下のwalletsディレクトリに配置します。

% ttClientImport path/exports.zip
Client definitions imported.

クライアント上のsys.odbc.iniファイルが更新され、クライアントDSNとそのTLS設定が追加されます。(既存のクライアントDSNに同じ名前がある場合、置き換えられます。)エクスポートされたsys.odbc.iniファイルの汎用ウォレット・パスは、既知の実際のウォレット・パスに従ってwallets/mydbCSWalletサブディレクトリ・パスで更新されます。

[mydbCS]
TTC_SERVER=mydb_CS
TTC_SERVER_DSN=mydb
# Wallet=timesten_home/conf/clientWallet
Encryption=required
CipherSuites=SSL_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
Wallet=timesten_home/conf/wallets/mydbCSWallet
# Wallet=mydbCSWallet

クライアント上のtimesten_home/confディレクトリから:

% ls
sys.odbc.ini  sys.ttconnect.ini  timesten.conf  wallets
% ls wallets
mydbCSWallet
% ls wallets/mydbCSWallet
cwallet.sso

インポートが完了したら、互換性のある暗号化フラグおよび暗号スイート設定を持つクライアントおよびサーバー構成を想定して、TLSを介してサーバーに接続できます。「クライアント/サーバー用のTLSの操作の確認」を参照してください。

これらのユーティリティの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』ttAdminおよびttClientImportを参照してください。

TimesTen Scaleoutでのクライアント/サーバー用のTLSの使用

これらは、TimesTenによって生成された証明書とともにTimesTen Scaleoutのクライアント/サーバーにTLSを使用するステップです。

タスク1: ttGridAdmin gridCreateおよびinstanceCreateを使用した証明書の生成およびTLS属性の設定

証明書は、ttGridAdmin gridCreateコマンドを使用してグリッドを定義すると常に生成されます。

ヒント:

TimesTen Scaleoutでは、最初の管理インスタンスを作成するときにttInstanceCreate –serverEncryptionおよび–serverCipherSuitesオプションを使用しないでください。ttInstanceCreateでは、これらのオプションはTimesTen Classic専用です。

gridCreateコマンドは、TLSの-serverEncryptionおよび–serverCipherSuitesオプションをサポートしています。設定は、グリッド上のデータベースおよびクライアント接続可能オブジェクトの定義に対してデフォルトで使用されます。(TLS属性の詳細は、「TLSのサーバー属性」を参照してください。)

たとえば、次のように指定します:

% ttGridAdmin gridCreate grid1 -k 2 -internalAddress intsys1.example.com -externalAddress extsys1.example.com -membershipConfig membership_dir/membership.conf -host mgthost -serverEncryption required -serverCipherSuites SSL_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
Grid grid1 created

gridCreateを実行すると、gridCreate –walletDir設定に従った場所に、またはデフォルトでtimesten_home/infoの下に、ウォレットが場所の最初の管理インスタンスに配置されます。

証明書を生成した後、ttGridAdmin certificateListコマンドを使用して証明書に関する情報を表示できます。デフォルトの有効期限は作成から3650日です。

% ttGridAdmin certificateList
NAME          HOLDER           EXPIRATION
clientWallet  CN=client1,C=US  Sun Sep 12 20:42:40 UTC 2032
rootWallet    CN=ecRoot,C=US   Sun Sep 12 20:42:24 UTC 2032
serverWallet  CN=server1,C=US  Sun Sep 12 20:42:32 UTC 2032

グリッドのデータ・インスタンスを定義するたびに、オプションで-walletDir設定を指定して、そのインスタンスに証明書を配置する場所を決定できます。(それ以外の場合は、グリッドの作成中に設定された場所を使用することをお薦めします。)たとえば、次のように指定します:

% ttGridAdmin instanceCreate -host datahost1 -location instances_dir -name instance_1 -daemonport 16010 -csport 16012 -walletDir wallets_dir/wallets1
Instance instance_1 on Host datahost1 created in Model

証明書は、グリッド・モデルが適用されたときに、instanceCreate –walletDirオプションで指定した場所の下か、デフォルトでtimesten_home/infoの下にあるwalletsサブディレクトリにあるデータ・インスタンスにコピーされます。次に、データ・インスタンスのwalletsディレクトリの内容を示します。(rootWalletディレクトリは無視してください。)

% ls wallets
clientWallet  rootWallet  serverWallet
% ls wallets/clientWallet
cwallet.sso
% ls wallets/serverWallet
cwallet.sso

失効後など、いつでも証明書を再生成する必要がある場合は、ttCreateCertsを実行し、すべてのデータ・インスタンスに接続し、新しいウォレットを各データ・インスタンスにコピーするttGridAdmin certificateRegenコマンドを使用して再生成できます。

% ttGridAdmin certificateRegen
Certificates generated

証明書の再生成後、クライアントは、新しいウォレットがサーバーからエクスポートされてクライアントにインポートされるまで接続できません。「タスク5: TimesTen Scaleoutでの証明書および構成のインポート」を参照してください。

certificateRegenを使用する場合は、暗号化フラグおよび暗号スイートに新しい値を設定することもできます。これらは、その後定義されるデータベースまたは接続可能オブジェクトのデフォルト値として使用されます。

詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』証明書の再生成(certificateRegen)を参照してください。

タスク2: TimesTen ScaleoutでのTLSのサーバー構成の設定

グリッドでTLSを使用する場合、通常、前述のttGridAdmin gridCreateコマンドでグリッドを定義するときに使用するサーバー暗号化フラグおよび暗号スイートを指定します。これらは、グリッド上の任意のデータベースのデフォルト値になります。ttGridAdmin instanceCreateコマンドを使用して、データ・インスタンスごとにウォレットの場所を指定することもできます。後で、設定できる追加のTLS構成属性もあります。

グリッド内のデータベースでは、ttGridAdmin dbdefCreateコマンドに指定するデータベース定義ファイルdbname.dbdefに接続属性を設定することで、そのデータベースに固有の暗号化設定を指定できます。

これは、mydbという名前のデータベースの一般的な.dbdefファイルmydb.dbdefです。

DatabaseCharacterSet=AL32UTF8
PermSize=128
TempSize=128
DataStore=databases_dir/mydb
ConnectionCharacterSet=AL32UTF8

ここで、この特定のデータベースについて、(Encryption属性を使用して)サーバー暗号化フラグまたは(CipherSuites属性を使用して)暗号スイートの代替設定を指定するか、「TLSのサーバー属性」で説明されている追加属性の設定を指定できます。たとえば、クライアントの認証を要求するには、次のようにします:

SSLClientAuthentication=1

(SSLClientAuthenticationを使用する場合は、サーバーとクライアントに対して同じ設定が必要です。)

グリッド・モデルが適用されると、「タスク1: ttGridAdmin gridCreateおよびinstanceCreateを使用した証明書の生成およびTLS属性の設定」に示されている、gridCreate -serverEncryptionおよび-serverCipherSuite設定およびinstanceCreate -walletDir設定の結果として、mydbのデータ・インスタンスinstance_1sys.odbc.iniファイルに次の設定が含まれています。

[mydb]
DatabaseCharacterSet=AL32UTF8
PermSize=128
TempSize=128
DataStore=databases_dir/mydb
ConnectionCharacterSet=AL32UTF8
...
CipherSuites=SSL_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
...
Encryption=required
...
Wallet=wallets_dir/wallets1/wallets/serverWallet
...
SSLClientAuthentication=1

必要に応じて、『Oracle TimesTen In-Memory Database Scaleoutユーザーズ・ガイド』データベース定義での接続属性の変更の説明に従って、ttGridAdmin dbdefExportおよびdbdefModifyコマンドを使用して、後から設定を変更できます。

タスク3: TimesTen ScaleoutでのTLSのクライアント構成の設定

TimesTen Scaleoutクライアントの場合、接続可能オブジェクトを作成するttGridAdmin connectableCreateコマンドで指定した.connect構成ファイルでTLS属性を設定できます。

使用可能な属性の説明は、「TLSのクライアント属性」を参照してください。たとえば、クライアントの認証を要求するには、次のようにします:

SSLClientAuthentication=1

(SSLClientAuthenticationを使用する場合は、サーバーとクライアントに対して同じ設定が必要です。)

接続可能オブジェクトが定義され、グリッド・モデルが適用されると、データ・インスタンスのgridCreate -serverEncryptionおよび-serverCipherSuite設定とinstanceCreate -walletDir設定の結果として、データベースmydbへのクライアント/サーバー接続用のデータ・インスタンスinstance_1sys.odbc.iniファイルに次の設定が含まれています:

[mydbcs]
ConnectionCharacterSet=AL32UTF8
TTC_Timeout=360
...
CipherSuites=SSL_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
Encryption=required
Wallet=wallets_dir/wallets1/wallets/clientWallet
...
SSLClientAuthentication=1

必要に応じて、『Oracle TimesTen In-Memory Database Scaleoutユーザーズ・ガイド』接続オブジェクトでの接続属性の変更の説明に従って、ttGridAdmin connectableExportおよびconnectableModifyコマンドを使用して、後から設定を変更できます。

タスク4: TimesTen Scaleoutでの証明書および構成のエクスポート

ttGridAdminユーティリティには、ウォレットを含むZIPファイル、データベースへのアクセスに使用できるsys.odbc.iniファイル、および適用可能なその他のファイル(tnsnames.oraなど)を出力するgridClientExportAllコマンドがあります。ウォレットには、相互認証のためのCA公開キーおよびクライアント証明書が含まれています。

管理インスタンスからgridClientExportAllコマンドを実行し、コマンドラインで目的のZIPファイルのパスと名前を指定します。ttGridAdminユーティリティは、gridCreateコマンドでのグリッドの作成時に作成された証明書を取得します。この例では、管理インスタンスのtimesten_home/infoディレクトリに出力ZIPファイルclientexport.zipを配置しています:

% ttGridAdmin gridClientExportAll timesten_home/info/clientexport.zip
Definitions exported to timesten_home/info/clientexport.zip

ZIPファイルの内容は次のとおりです:

  • クライアント・ウォレットを含むディレクトリ

  • TLS設定など、クライアントでデータベースへの接続に使用するsys.ocbc.iniファイル

  • TimesTenリリース、グリッドおよびTLS設定に関する情報を含むJSONファイル

  • その他のファイル(tnsnames.oraなど) (該当する場合)

タスク5: TimesTen Scaleoutでの証明書および構成のインポート

クライアントからttClientImportユーティリティを実行して、ttGridAdmin -gridClientExportAllコマンドで作成されたエクスポートZIPファイルの内容をインポートします。

証明書をZIPファイルにエクスポートしたら、ZIPファイルを各クライアント上の目的の場所にコピーしてから、ttClientImportを実行して内容をインポートします。これには、エクスポートされたウォレットおよびsys.odbc.iniファイルが含まれています。ユーティリティは、グリッド名に基づくディレクトリtimesten_home/conf/wallets/gridnameWalletにウォレットを配置します。

% ttClientImport path/clientexport.zip
Client definitions imported.

この例では、グリッド名はgrid1です。クライアントのsys.odbc.iniファイル内のクライアントDSNエントリが更新され、TLSおよびウォレット設定が追加されます:

[mydbcs]
TTC_SERVER_DSN=MYDB
# External address/port info for datahost1.instance_1
TTC_SERVER1=extsys1.example.com/16012
...
CipherSuites=SSL_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
Encryption=required
# Wallet=wallet_dir/wallets/clientWallet
ConnectionCharacterSet=AL32UTF8
TTC_Timeout=360
Wallet=timesten_home/conf/wallets/grid1Wallet

インポートが完了したら、互換性のある暗号化フラグおよび暗号スイート設定を持つクライアントおよびサーバー構成を想定して、TLSを介してサーバーに接続できます。「クライアント/サーバー用のTLSの操作の確認」を参照してください。

これらのユーティリティの構文およびオプションの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』グリッド外でのクライアント/サーバー接続用のsys.odbc.iniのエクスポート(gridClientExport)およびttClientImportを参照してください。

TimesTen Classicでのクライアント/サーバー用のCA署名証明書の使用

この章のTLSの使用に関するほとんどの説明は、ttCreateCertsユーティリティによって生成された自己署名証明書を使用するためのものですが、TimesTenではサード・パーティの認証局(CA)によって署名された証明書の使用もサポートされています。この項では、そのためのプロセスについて説明します。

CA署名証明書の使用の概要

TimesTenで認証局によって署名された証明書を使用するには、サーバー・ウォレットおよびクライアント・ウォレットを作成して移入する必要があります。

通常はopensslを使用して秘密キーと証明書リクエスト(.csrファイル)を取得し、認証局(CA)に証明書リクエストを送信し、CAが署名チェーンで署名証明書を返したことを想定しています。

x509証明書を含む.pemファイルから、CAによって提供される証明書からルートに順に証明書を連結します。(証明書が.pem形式でない場合は、opensslまたはその他の適切なユーティリティを使用して証明書を変換します。)後続の項の説明では、結果がcomplete.pemと呼ばれ、秘密キーがprivkey.pemにあると想定しています。次に、証明書をpkcs12ファイルにパッケージ化します。

このプロセスの最後に、サーバー・ウォレットには次のものが含まれます:

  • 証明書チェーン全体。これは、CAからの証明書、中間証明書、およびルート証明書で構成されます。
  • CAからの証明書の秘密キー。

クライアント・ウォレットには次のものが含まれています:

  • CA証明書を除いた証明書チェーン。これは、中間証明書とルート証明書で構成されます。

サーバー・ウォレットの作成

TimesTenでCA署名証明書を使用するには、サーバー・ウォレットおよびクライアント・ウォレットに証明書を手動でインポートする必要があります。サーバー・ウォレットに対して次のステップを実行します。

  1. x509証明書を含む.pemファイルから、CAから受信される証明書からルートに順に証明書を連結します。たとえば、次のように指定します:
    % cat cert.pem certsigner1.pem certsigner2.pem root.pem > complete.pem
  2. 次の例のように、証明書をpkcs12ファイルにパッケージ化します。opensslコマンドで任意のパスワードを使用します。Oracleウォレットには含まれません。この例では、連結された証明書はcomplete.pemにあり、秘密キーはprivkey.pemにあります。
    % openssl pkcs12 -export -in complete.pem -inkey privkey.pem -out server.p12 -password pass:mypwd
  3. TimesTenのttCreateCertsユーティリティを使用して、空のauto_login_only Oracleウォレットを作成します。(ttCreateCertsおよび-runオプションの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』ttCreateCertsを参照してください。)
    % ttCreateCerts -run "wallet create -wallet serverWallet -auto_login_only"
  4. 証明書と秘密キーをウォレットに格納します。たとえば、次のように指定します:
    % ttCreateCerts -run "wallet import_pkcs12 -wallet serverWallet -auto_login_only -pkcs12file server.p12 -pkcs12pwd mypwd"
  5. サーバー・ウォレットを確認します。これには、中間証明書とルート証明書が信頼できる証明書であり、新しい証明書がユーザー証明書であることの確認が含まれています。(ユーザー証明書は、TimesTenに秘密キーがあることを意味します。)出力は、次に示す基本形式である必要があります。
    % ttCreateCerts -run "wallet display -wallet path/serverWallet"
    Requested Certificates:
    User Certificates:
    Subject:        CN=www.example.com,O=xxxxxxxxxxxxxx,L=xxxxxxxxxxxxxx,ST=xxxxxxxxxxxxxx,C=US
    Trusted Certificates:
    Subject:        CN=xxxxxxxxxxxxxx SHA-256 Private Root,O=xxxxxxxxxxxxxx,C=US
    Subject:        CN=xxxxxxxxxxxxxx SHA-256 Private Intermediate,O=xxxxxxxxxxxxxx,C=US

クライアント・ウォレットの作成

TimesTenでCA署名証明書を使用するには、サーバー・ウォレットおよびクライアント・ウォレットに証明書を手動でインポートする必要があります。クライアント・ウォレットに対して次のステップを実行します。

  1. クライアント・ウォレットに空のauto_login_only Oracleウォレットを作成します。(ttCreateCertsおよび-runオプションの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』ttCreateCertsを参照してください。)
    % ttCreateCerts -run "wallet create -wallet clientWallet -auto_login_only"
  2. 必要に応じて中間署名者を追加し、次にルート証明書を1つずつ追加します。
    % ttCreateCerts -run "wallet add -wallet  clientWallet -auto_login_only -trusted_cert -cert intsig1.pem"
    ...
    % ttCreateCerts -run "wallet add -wallet  clientWallet -auto_login_only -trusted_cert -cert intsigN.pem"
    % ttCreateCerts -run "wallet add -wallet  clientWallet -auto_login_only -trusted_cert -cert root.pem"
  3. クライアント・ウォレットを確認します。これには、ルート証明書が信頼できる証明書であり、ウォレットにユーザー証明書がないことの確認が含まれています。出力は、次に示す基本形式である必要があります。
    % ttCreateCerts -run "wallet display -wallet path/clientWallet"
    Requested Certificates:
    User Certificates:
    Trusted Certificates:
    Subject:        CN=xxxxxxxxxxxxxx SHA-256 Private Intermediate,O=xxxxxxxxxxxxxx,C=US
    Subject:        CN=xxxxxxxxxxxxxx SHA-256 Private Root,O=xxxxxxxxxxxxxx,C=US

クライアント・ウォレットおよびサーバー・ウォレットに移入したら、互換性のある暗号化フラグおよび暗号スイート設定を持つクライアントおよびサーバー構成を想定して、TLSを介してサーバーに接続できます。「クライアント/サーバー用のTLSの操作の確認」を参照してください。

クライアント/サーバー用のTLSの操作の確認

TLSがEncryptionCipherSuiteの設定が十分に一致するサーバーとクライアントの両方で構成されている場合は、接続が確立され次第、TLSが使用されます。

これを確認するには、クライアント上でttIsqlCSからsqlgetconnectattr tt_tls_sessionをコールします。戻り値1は、TLSが使用されていることを示します。

次の一連の例は、サーバーとクライアントの暗号化設定のいくつかの組合せの結果を示しています。

シナリオ1: サーバーとクライアントで、同じ暗号スイート設定を使用して暗号化が要求されます。接続に成功し、TLSが使用されます。

サーバーDSN定義:

[mydb]
Driver=timesten_home/install/lib/libtten.so
DataStore=/db/databases/mydb
PermSize=512
TempSize=128
LogBufMB=256
LogFileSize=256
LogDir=/db/logs
DatabaseCharacterSet=AL32UTF8
OracleNetServiceName=ttorcl
Wallet=timesten_home/conf/mywallets/serverWallet
Encryption=requested
CipherSuites=SSL_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384

クライアントDSN定義:

[mydbCS]
TTC_SERVER=myserverhost.example.com
TTC_SERVER_DSN=mydb
UID=myuser
PWD=welcome
Wallet=timesten_home/conf/mywallets/clientWallet
Encryption=requested
CipherSuites=SSL_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384

timesten_home/binディレクトリからttIsqlCSを実行して接続(出力は読みやすく書式設定されています):

% ttIsqlCS mydbCS
 
Copyright (c) 1996, 2022, Oracle and/or its affiliates. All rights reserved.
Type ? or "help" for help, type "exit" to quit ttIsql.
 
connect "DSN=mydbCS";
Connection successful: DSN=mydbCS;TTC_SERVER=myserverhost.example.com;
TTC_SERVER_DSN=mydb;UID=myuser;DATASTORE=/db/databases/mydb;
DATABASECHARACTERSET=AL32UTF8;CONNECTIONCHARACTERSET=US7ASCII;LOGFILESIZE=256;
LOGBUFMB=256;LOGDIR=/db/logs;PERMSIZE=512;TEMPSIZE=128;
ORACLENETSERVICENAME=ttorcl;(SERVER)ENCRYPTION=Requested;
(SERVER)WALLET=file:timesten_home/conf/mywallets/serverWallet;
(client)Encryption=Requested;
(client)Wallet=/timesten_home/conf/mywallets/clientWallet;
(client)CipherSuites=SSL_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384;
(Default setting AutoCommit=1)

TLSが有効になっていることを確認:

Command> sqlgetconnectattr tt_tls_session;
TT_TLS_SESSION = 1 (SQL_TRUE)

シナリオ2: サーバーとクライアントで暗号化が要求されますが、暗号スイート設定が一致していません。接続には成功しますが、TLSが使用されていないことを示す警告メッセージが表示されます。(ここに表示されるものを除き、設定はシナリオ1と同じです。)

サーバーDSN定義から:

CipherSuites=SSL_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256

クライアントDSN定義から:

CipherSuites=SSL_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384

接続:

% ttIsqlCS mydbCS
 
Copyright (c) 1996, 2022, Oracle and/or its affiliates. All rights reserved.
Type ? or "help" for help, type "exit" to quit ttIsql.
 
connect "DSN=mydbCS";
 
Warning 01000: Unable to create requested TLS session; unencrypted session 
created. Check Wallet and CipherSuites on client and server. SSL error: SSL 
Fatal Alert
 
Connection successful: 
...

シナリオ3: サーバーおよびクライアントで暗号化が受け入れられます。表3-1に示すように、これはTLSの使用に十分ではありません。接続に成功しますが、TLSは使用されません。(ここに表示されるものを除き、設定はシナリオ1と同じです。)

サーバーDSN定義から:

Encryption=accepted

クライアントDSN定義から:

Encryption=accepted

接続:

% ttIsqlCS mydbCS
 
Copyright (c) 1996, 2022, Oracle and/or its affiliates. All rights reserved.
Type ? or "help" for help, type "exit" to quit ttIsql.
 
connect "DSN=mydbCS";
Connection successful: 
...
Command> sqlgetconnectattr tt_tls_session;
TT_TLS_SESSION = 0 (SQL_FALSE)

シナリオ4: クライアントでは暗号化が要求されますが、サーバーでは拒否されます。接続試行に失敗します。(ここに表示されるものを除き、設定はシナリオ1と同じです。)

サーバーDSN定義から:

Encryption=rejected

クライアントDSN定義から:

Encryption=required

接続を試行:

% ttIsqlCS mydbCS
 
Copyright (c) 1996, 2022, Oracle and/or its affiliates. All rights reserved.
Type ? or "help" for help, type "exit" to quit ttIsql.
 
connect "DSN=mydbCS";
HY000: Connection rejected: inconsistent encryption attributes
The command failed.
Done.